Denne artikel viser, hvordan du tilføjer en primær nøgle til en eksisterende tabel i SQL Server ved hjælp af Transact-SQL.
En primær nøgle er en kolonne, der er konfigureret som den unikke identifikator for en given tabel.
Du ville normalt oprette en primærnøglebegrænsning, når du opretter tabellen, men du kan også tilføje en primærnøgle til en eksisterende tabel.
Bemærk, at en tabel kun kan have én primær nøgle. Så du kan ikke tilføje en primær nøgle, hvis tabellen allerede har en.
Primære nøgler kan også kun tilføjes til kolonner, der er defineret som NOT NULL
.
Eksempel 1 – Tilføj en primær nøglebegrænsning
I dette eksempel opretter jeg en tabel, men jeg glemmer at tilføje en primær nøglebegrænsning. Så jeg går tilbage og ændrer tabellen, så den har en primær nøgle.
Opret tabellen (men glem at oprette en primær nøgle ):
USE Test; CREATE TABLE Colors ( ColorId int IDENTITY (1,1) NOT NULL, ColorName varchar(50) );
Resultat:
Commands completed successfully. Total execution time: 00:00:00.058
Ups – jeg glemte at oprette den primære nøgle!
Intet problem! Vi kan tilføje en nu:
ALTER TABLE Colors ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);
Resultat:
Commands completed successfully. Total execution time: 00:00:00.031
Dette har nu tilføjet en PRIMARY KEY
begrænsning for ColorId
kolonne.
Eksempel 2 – Tjek den primære nøglebegrænsning
Lad os køre følgende kode for at returnere en liste over primære nøglebegrænsninger 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__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
Dine resultater vil være forskellige, afhængigt af de primære nøgler i din database.
Bemærk også, at denne systemvisning returnerer flere kolonner, end hvad jeg har angivet her, men du kan bruge *
jokertegn for at returnere alle kolonner, hvis du ønsker det.
Eksempel 3 – Tilføjelse af en primær nøgle til en kolonne, der tillader NULL-værdier
En primær nøgle kan kun tilføjes til kolonner, der er defineret som NOT NULL
. Hvis du forsøger at tilføje en primær nøgle til en kolonne, der kan nulstilles, får du en fejl.
For at demonstrere dette, lad os oprette en anden tabel, men denne gang glemmer vi også at angive kolonnen som NOT NULL
:
USE Test; CREATE TABLE Colors2 ( ColorId int, ColorName varchar(50) );
Vi kan køre følgende forespørgsel for at kontrollere, om kolonnen tillader null eller ej:
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 = 'ColorId';
Resultat:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 1 | 0 | +---------+----------+---------------+---------------+
Vi kan se, at den vi oprettede tidligere (i Colors
tabel) er nullbar og er en identitetskolonne. Den anden (i Colors2
tabel) er nullbar og er ikke en identitetskolonne.
Lad os nu prøve at tilføje en primær nøglebegrænsning til den nullbare kolonne:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
Resultat:
Msg 8111, Level 16, State 1, Line 1 Cannot define PRIMARY KEY constraint on nullable column in table 'Colors2'. Msg 1750, Level 16, State 0, Line 1 Could not create constraint or index. See previous errors.
Så i dette tilfælde bliver vi nødt til at ændre kolonnen til at være NOT NULL
før vi forsøger at definere den som den primære nøgle.
Vi kan bruge ALTER COLUMN
i en ALTER TABLE
sætning for at sætte denne kolonne til NOT NULL
:
ALTER TABLE Colors2 ALTER COLUMN ColorId int NOT NULL;
Lad os tjekke kolonnen igen:
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 = 'ColorId';
Resultat:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 0 | +---------+----------+---------------+---------------+
Så vi kan se den Colors2
er nu indstillet til 0
, hvilket betyder, at den ikke er nullbar (den kan ikke indeholde NULL-værdier).
Bemærk også, at kolonnen ikke er en identitetskolonne. Jeg vil diskutere dette senere.
Anyway, nu hvor kolonnen er defineret som NOT NULL
vi kan gå videre og tilføje den primære nøgle:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
Resultat:
Commands completed successfully. Total execution time: 00:00:00.048
For at bekræfte, lad os igen tjekke alle primære nøglebegrænsninger for denne tabel:
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__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK_Colors2_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
Vores nye primære nøgle, som vi kaldte PK_Colors2_ColorId
er blevet tilføjet til listen.
Eksempel 4 – Ændring af en kolonne til at være en identitetskolonne
Primære nøgler anvendes ofte på identitetskolonner. Identitetskolonner er defineret som sådan med IDENTITY
nøgleord, efterfulgt af en valgfri start- og stigningsværdi inden for parentes.
Når en ny række føjes til tabellen, giver SQL Server en unik, trinvis værdi for identitetskolonnen.
Hvis du planlægger at bruge en identitetskolonne, skal du allerede have gjort det. Du kan ikke ændre en eksisterende kolonne til at være en identitetskolonne.
Da jeg kørte forespørgslen tidligere, kunne vi se, at Colors2.ColorId
kolonne er ikke en identitetskolonne (vi ved dette, fordi is_identity
er indstillet til 0
). Det betyder, at jeg oprettede PK_Colors2_ColorId
primær nøgle på en ikke-identitetskolonne.
Her er, hvad der sker, hvis vi forsøger at ændre tabellen til at være en identitetskolonne:
ALTER TABLE Colors2 ALTER COLUMN ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;
Resultat:
Msg 156, Level 15, State 1, Line 3 Incorrect syntax near the keyword 'IDENTITY'.
Som nævnt, for at overvinde dette, skal vi droppe kolonnen og starte forfra.
Hvis kolonnen allerede indeholder data, skal du gøre noget ekstra arbejde. Det er uden for rammerne af denne artikel, men her er et eksempel på at droppe ovenstående kolonne og genskabe den som en identitetskolonne:
USE Test; DROP TABLE Colors2; CREATE TABLE Colors2 ( ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY, ColorName varchar(50) );
Resultat:
Commands completed successfully. Total execution time: 00:00:00.049
Bemærk, at jeg ikke gav et navn til den primære nøglebegrænsning denne gang. I dette tilfælde vil systemet oprette et navn til det.
Tjek hurtigt kolonnen:
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 = 'ColorId';
Resultat:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 1 | +---------+----------+---------------+---------------+
Ja, det er nu en identitetskolonne.
Lad os tage et nyt kig på de primære nøgler til denne tabel:
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__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK__Colors2__8DA7674D8F57294D | PK | 1 | 1 | +-------------------------------+--------+-------------------+-------------------+
Så vi har nu en systemnavnet primær nøgle kaldet PK__Colors2__8DA7674D8F57294D
.