sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan tilføjes en primær nøgle til en eksisterende tabel i SQL Server (T-SQL-eksempler)

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 .


  1. Hvad er det bedste PostgreSQL High Availability Framework? PAF vs. repmgr vs. Patroni Infographic

  2. Automatisk stigningskolonne – Sekvens som standardværdi i Oracle

  3. Kalder Oracle lagret procedure med output parameter fra SQL Server

  4. MySQL konverterer datostreng til Unix tidsstempel