sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man skapar en primär nyckel i SQL Server (T-SQL-exempel)

Den här artikeln visar hur du skapar en primärnyckel i SQL Server när du skapar en tabell med Transact-SQL.

En primärnyckel är en eller flera kolumner som har konfigurerats som den unika identifieraren för en given tabell. Primära nycklar kan användas för att framtvinga dataintegritet i tabellen.

En tabell kan bara ha en primärnyckel, och primärnycklar kan bara läggas till i kolumner som är definierade som NOT NULL .

Den här artikeln visar hur man skapar en primärnyckel i en ny tabell (dvs. när du skapar tabellen). Om du behöver skapa en primärnyckel i en befintlig tabell, se Hur man lägger till en primärnyckel till en befintlig tabell i SQL Server.

Exempel 1 – Skapa en tabell med en primärnyckel

Först skapar jag en testdatabas:

CREATE DATABASE PK_Test;

Skapa nu en ny tabell som innehåller en primärnyckelbegränsning:

USE PK_Test;

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

Detta skapade en ny tabell som heter Colors som har en primärnyckelrestriktion på sin ColorId kolumn.

Exempel 2 – Kontrollera den primära nyckelbegränsningen

Vi kan köra följande kod för att returnera en lista över primära nyckelbegränsningar i databasen:

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

Resultat:

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

Jag har minskat kolumnerna för det här exemplet. sys.key_constraints systemvyn returnerar fler kolumner än så här. Du kan alltid använda * jokertecken för att returnera alla kolumner om du vill.

Vi kan se av frågeresultatet att denna databas bara har en primärnyckel (den vi just skapade).

I det här fallet namngavs primärnyckeln automatiskt av systemet. Du har också möjlighet att ange ditt eget namn (mer om det senare).

Exempel 3 – Kontrollera indexet

Som standard skapas ett klustrat index när du skapar primärnyckeln. Du kan ange det klustrade indexet uttryckligen eller låta det skapas automatiskt. Du har också möjlighet att ange ett icke-klustrat index.

Här är en fråga som returnerar indexet som skapades automatiskt när jag skapade primärnyckeln ovan:

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

Resultat (med vertikal utdata):

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

I det här fallet har jag begränsat resultaten till bara raden som innehåller samma namn på primärnyckeln som jag just skapade. Du kan alltid ta bort WHERE klausul om du behöver fler resultat som ska returneras.

Vi kan se att detta index har en type_desc av CLUSTERED .

Exempel 4 – Namnge den primära nyckeln

Den primära nyckeln som vi skapade ovan namngavs automatiskt av systemet. Du kan ange ditt eget namn om du föredrar det.

Här är ett exempel på hur du anger ett namn för primärnyckeln. I det här fallet anger jag också ett icke-klustrat index.

USE PK_Test;

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

I det här fallet använder jag den valfria CONSTRAINT nyckelord för att indikera början av definitionen av primärnyckeln, följt av mitt valda namn för primärnyckeln. Jag använder också NONCLUSTERED nyckelord för att ange att ett icke-klustrat index.

Kontrollera primärnyckeln:

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

Resultat:

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

Kontrollera indexet:

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

Resultat (med vertikal utdata):

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

Så vi kan se att den här gången type_desc är ICLUSTERAD .

Observera att när du skapar en tabell, CLUSTERED kan endast anges för en begränsning. Om det är specificerat för en UNIQUE begränsning och en PRIMARY KEY begränsning är också specificerad, PRIMARY KEY standard till NONCLUSTERED .

Exempel 5 – Skapa en primärnyckel på en nullbar kolumn

En primärnyckel kan endast skapas för kolumner som är definierade som NOT NULL . Om du försöker skapa en primärnyckel på en kolumn som är inställd på NULL , får du ett felmeddelande.

Men om du inte anger nollbarheten är kolumnen satt till NOT NULL som standard.

För att demonstrera detta, låt oss skapa en annan tabell, men den här gången ställer vi in ​​den till NULL :

USE PK_Test;

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

Resultat:

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.

Som väntat får vi ett fel.

Låt oss ta bort NULL från tabelldefinitionen och försök igen:

USE PK_Test;

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

Resultat:

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

Den här gången skapades tabellen framgångsrikt.

Låt oss ta en titt på det:

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';

Resultat:

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

Så vi kan se att det inte är nullbart, eftersom is_nullable flaggan är inställd på 0 .

Exempel 6 – Primär nyckel på flera kolumner

Du kan också skapa en primärnyckel på flera kolumner. Primärnycklar med flera kolumner är också kända som sammansatta primärnycklar. För att skapa en sammansatt primärnyckel, separera helt enkelt kolumnerna med ett kommatecken när du definierar nyckeln.

Så här:

CONSTRAINT PK_Name PRIMARY KEY (Column1, Column2)

Här är ett exempel på en situation där en primärnyckel med flera kolumner kan användas:

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)
);

I det här exemplet är BandMember tabellen har en primärnyckel med flera kolumner. I det här fallet är varje kolumn i primärnyckeln också en främmande nyckel till primärnyckeln i en annan tabell, men detta är inte ett krav.

Se Hur man skapar en sammansatt primärnyckel i SQL Server för en mer detaljerad förklaring av detta exempel.

Se även Hur man skapar en sammansatt främmande nyckel i SQL Server för ett exempel som tar det ett steg längre med en främmande nyckel med flera kolumner som refererar till ovanstående sammansatta primärnyckel.


  1. Hur man genererar ett datumintervall i SQL Server

  2. SQL Server Databas Objects Statistik

  3. Hur man löser ORA-28000 kontot är låst

  4. Ogiltigt parameternummer:parametern definierades inte. Infogar data