Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да създадете първичен ключ в SQL Server (T-SQL примери)

Тази статия демонстрира как да създадете първичен ключ в SQL Server, когато създавате таблица с помощта на Transact-SQL.

Първичният ключ е една или повече колони, които са конфигурирани като уникален идентификатор за дадена таблица. Първичните ключове могат да се използват за налагане на целостта на данните в таблицата.

Таблицата може да има само един първичен ключ и първичните ключове могат да се добавят само към колони, които са дефинирани като NOT NULL .

Тази статия демонстрира как да създадете първичен ключ в нов таблица (т.е. при създаване на таблицата). Ако трябва да създадете първичен ключ в съществуващ таблица, вижте Как да добавите първичен ключ към съществуваща таблица в SQL Server.

Пример 1 – Създайте таблица с първичен ключ

Първо ще създам тестова база данни:

CREATE DATABASE PK_Test;

Сега създайте нова таблица, която включва ограничение за първичен ключ:

USE PK_Test;

CREATE TABLE Colors
(
    ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
    ColorName varchar(50)
);

Това създаде нова таблица, наречена Colors който има ограничение за първичен ключ за своя ColorId колона.

Пример 2 – Проверете ограничението на първичния ключ

Можем да изпълним следния код, за да върнем списък с ограничения на първичния ключ в базата данни:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Резултат:

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
+------------------------------+--------+-------------------+-------------------+

Стесних колоните за този пример. sys.key_constraints системният изглед връща повече колони от това. Винаги можете да използвате * заместващ знак, за да върнете всички колони, ако желаете.

От резултата от заявката можем да видим, че тази база данни има само един първичен ключ (този, който току-що създадохме).

В този случай първичният ключ е автоматично именуван от системата. Освен това имате възможност да предоставите собствено име (повече за това по-късно).

Пример 3 – Проверете индекса

По подразбиране се създава клъстериран индекс, когато създавате първичен ключ. Можете да посочите клъстерирания индекс изрично или да го оставите да бъде създаден автоматично. Имате и опцията да посочите неклъстериран индекс.

Ето заявка, която връща индекса, който беше създаден автоматично, когато създадох горния първичен ключ:

SELECT *
FROM sys.indexes
WHERE name = 'PK__Colors__8DA7674DD34F4585';

Резултат (с помощта на вертикален изход):

object_id                  | 885578193
name                       | PK__Colors__8DA7674DD34F4585
index_id                   | 1
type                       | 1
type_desc                  | CLUSTERED
is_unique                  | 1
data_space_id              | 1
ignore_dup_key             | 0
is_primary_key             | 1
is_unique_constraint       | 0
fill_factor                | 0
is_padded                  | 0
is_disabled                | 0
is_hypothetical            | 0
is_ignored_in_optimization | 0
allow_row_locks            | 1
allow_page_locks           | 1
has_filter                 | 0
filter_definition          | NULL
compression_delay          | NULL
suppress_dup_key_messages  | 0
auto_created               | 0

В този случай стесних резултатите само до реда, който съдържа същото име на първичния ключ, който току-що създадох. Винаги можете да премахнете WHERE клауза, ако имате нужда от повече резултати, за да бъдат върнати.

Можем да видим, че този индекс има type_desc от КЛУСТРИРАНИ .

Пример 4 – Именуване на първичния ключ

Първичният ключ, който създадохме по-горе, беше автоматично именуван от системата. Можете да посочите собственото си име, ако предпочитате.

Ето пример за посочване на име за първичния ключ. В този случай посочвам и неклъстериран индекс.

USE PK_Test;

CREATE TABLE Cats
(
    CatId int IDENTITY (1,1) NOT NULL, 
       CONSTRAINT PK_Cats_CatId PRIMARY KEY NONCLUSTERED (CatId),
    CatName varchar(50)
);

В този случай използвам незадължителното CONSTRAINT ключова дума, за да посочи началото на дефиницията на първичния ключ, последвана от избраното от мен име за първичен ключ. Аз също използвам NONCLUSTERED ключова дума, за да посочите, че е неклъстериран индекс.

Проверете първичния ключ:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Резултат:

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
| PK_Cats_CatId                | PK     | 2                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Проверете индекса:

SELECT *
FROM sys.indexes
WHERE name = 'PK_Cats_CatId';

Резултат (с помощта на вертикален изход):

object_id                  | 917578307
name                       | PK_Cats_CatId
index_id                   | 2
type                       | 2
type_desc                  | NONCLUSTERED
is_unique                  | 1
data_space_id              | 1
ignore_dup_key             | 0
is_primary_key             | 1
is_unique_constraint       | 0
fill_factor                | 0
is_padded                  | 0
is_disabled                | 0
is_hypothetical            | 0
is_ignored_in_optimization | 0
allow_row_locks            | 1
allow_page_locks           | 1
has_filter                 | 0
filter_definition          | NULL
compression_delay          | NULL
suppress_dup_key_messages  | 0
auto_created               | 0

Така че можем да видим, че този път type_desc е НЕКЛУСТРИРАН .

Имайте предвид, че когато създавате таблица, CLUSTERED може да се посочи само за едно ограничение. Ако е посочено за UNIQUE ограничение и PRIMARY KEY ограничението също е посочено, PRIMARY KEY по подразбиране е NONCLUSTERED .

Пример 5 – Създаване на първичен ключ в колона с възможност за нула

Първичен ключ може да бъде създаден само за колони, които са дефинирани като NOT NULL . Ако се опитате да създадете първичен ключ в колона, която е настроена на NULL , ще получите грешка.

Ако обаче не посочите възможността за нула, колоната е зададена на NOT NULL по подразбиране.

За да демонстрираме това, нека създадем друга таблица, но този път ще я зададем на NULL :

USE PK_Test;

CREATE TABLE Dogs
(
    DogId int IDENTITY (1,1) NULL PRIMARY KEY,
    DogName varchar(50)
);

Резултат:

Msg 8147, Level 16, State 1, Line 3
Could not create IDENTITY attribute on nullable column 'DogId', table 'Dogs'.
Msg 8111, Level 16, State 1, Line 3
Cannot define PRIMARY KEY constraint on nullable column in table 'Dogs'.
Msg 1750, Level 16, State 0, Line 3
Could not create constraint or index. See previous errors.

Както се очакваше, получаваме грешка.

Нека премахнем NULL от дефиницията на таблицата и опитайте отново:

USE PK_Test;

CREATE TABLE Dogs
(
    DogId int IDENTITY (1,1) PRIMARY KEY,
    DogName varchar(50)
);

Резултат:

Commands completed successfully.
Total execution time: 00:00:00.015

Този път таблицата беше създадена успешно.

Нека да го разгледаме:

SELECT 
  t.name AS 'Table',
  c.name AS 'Column', 
  c.is_nullable,
  c.is_identity
FROM sys.columns c
INNER JOIN sys.tables T
ON c.object_id = t.object_id
WHERE c.name = 'DogId';

Резултат:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Dogs    | DogId    | 0             | 1             |
+---------+----------+---------------+---------------+

Така че можем да видим, че не е nullable, защото is_nullable флагът е настроен на 0 .

Пример 6 – Първичен ключ върху множество колони

Можете също да създадете първичен ключ на множество колони. Многоколонните първични ключове са известни още като съставни първични ключове. За да създадете съставен първичен ключ, просто разделете колоните със запетая, когато дефинирате ключа.

Като това:

CONSTRAINT PK_Name PRIMARY KEY (Column1, Column2)

Ето пример за ситуация, при която може да се използва първичен ключ с много колони:

CREATE TABLE Musician (
MusicianId int NOT NULL,
FirstName varchar(60),
LastName varchar(60),
CONSTRAINT PK_Musician PRIMARY KEY (MusicianID)
);

CREATE TABLE Band (
BandId int NOT NULL,
BandName varchar(255),
CONSTRAINT PK_Band PRIMARY KEY (BandId)
);

CREATE TABLE BandMember (
MusicianId int NOT NULL,
BandId int NOT NULL,
CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId),
CONSTRAINT FK_BandMember_Band FOREIGN KEY (BandId) REFERENCES Band(BandId),
CONSTRAINT FK_BandMember_Musician FOREIGN KEY (MusicianId) REFERENCES Musician(MusicianId)
);

В този пример BandMember таблицата има първичен ключ от няколко колони. В този случай всяка колона в първичния ключ също е външен ключ към първичния ключ на друга таблица, но това не е изискване.

Вижте Как да създадете композитен първичен ключ в SQL Server за по-подробно обяснение на този пример.

Вижте също как да създадете композитен външен ключ в SQL Server за пример, който отвежда стъпка напред с многоколонен външен ключ, който препраща към горния съставен първичен ключ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да ускорите груповото вмъкване в MS SQL Server с помощта на pyodbc

  2. Добавете IIS 7 AppPool Identities като входове в SQL Server

  3. Трябва ли да използвам правилото CASCADE DELETE?

  4. Как изброявате първичния ключ на таблица на SQL Server?

  5. Функция IndexOf в T-SQL