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

Sådan opretter du en primær nøgle i SQL Server (T-SQL eksempler)

Denne artikel viser, hvordan du opretter en primær nøgle i SQL Server, når du opretter en tabel ved hjælp af Transact-SQL.

En primær nøgle er en eller flere kolonner, der er blevet konfigureret som den unikke identifikator for en given tabel. Primære nøgler kan bruges til at håndhæve dataintegritet i tabellen.

En tabel kan kun have én primær nøgle, og primærnøgler kan kun tilføjes til kolonner, der er defineret som NOT NULL .

Denne artikel viser, hvordan man opretter en primær nøgle i en ny tabel (dvs. når du opretter tabellen). Hvis du har brug for at oprette en primær nøgle i en eksisterende tabel, se Sådan tilføjer du en primær nøgle til en eksisterende tabel i SQL Server.

Eksempel 1 – Opret en tabel med en primær nøgle

Først vil jeg oprette en testdatabase:

OPRET DATABASE PK_Test;

Opret nu en ny tabel, der indeholder en primær nøglebegrænsning:

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

Dette skabte en ny tabel kaldet Colors som har en primær nøglebegrænsning på sin ColorId kolonne.

Eksempel 2 – Tjek den primære nøglebegrænsning

Vi kan 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_namedFROM sys.key_constraintsWHERE type ='PK';

Resultat:

+-------------------------------------+--------+------ --------------+--------------------------+| navn | type | unikt_indeks_id | er_system_navngivet ||-------------------------------------+--------+------- ------------+--------------------------|| PK__Farver__8DA7674DD34F4585 | PK | 1 | 1 |+-------------------------------------+--------+------- ------------+---------------------------+

Jeg har indsnævret kolonnerne for dette eksempel. sys.key_constraints systemvisning returnerer flere kolonner end dette. Du kan altid bruge * jokertegn for at returnere alle kolonner, hvis du ønsker det.

Vi kan se ved forespørgselsresultatet, at denne database kun har én primær nøgle (den vi lige har oprettet).

I dette tilfælde blev den primære nøgle automatisk navngivet af systemet. Du har også mulighed for at oplyse dit eget navn (mere om det senere).

Eksempel 3 – Tjek indekset

Som standard oprettes et klynget indeks, når du opretter den primære nøgle. Du kan specificere det klyngede indeks eksplicit eller lade det oprettes automatisk. Du har også mulighed for at angive et ikke-klynget indeks.

Her er en forespørgsel, der returnerer det indeks, der blev oprettet automatisk, da jeg oprettede ovenstående primærnøgle:

SELECT *FROM sys.indexesWHERE name ='PK__Colors__8DA7674DD34F4585';

Resultat (ved hjælp af lodret output):

objekt_id | 885578193navn | PK__Colors__8DA7674DD34F4585index_id | 1type | 1type_desc | CLUSTEREDis_unik | 1data_space_id | 1ignore_dup_key | 0is_primary_key | 1is_unique_constraint | 0fill_factor | 0is_polstret | 0is_disabled | 0er_hypotetisk | 0is_ignored_in_optimization | 0allow_row_locks | 1allow_page_locks | 1har_filter | 0filter_definition | NULLcompression_delay | NULLsuppress_dup_key_messages | 0auto_created | 0

I dette tilfælde indsnævrede jeg resultaterne til kun den række, der indeholder det samme navn på den primære nøgle, jeg lige har oprettet. Du kan altid fjerne WHERE klausul, hvis du har brug for, at flere resultater skal returneres.

Vi kan se, at dette indeks har en type_desc af KLUSTERET .

Eksempel 4 – Navngivning af den primære nøgle

Den primære nøgle, som vi oprettede ovenfor, blev automatisk navngivet af systemet. Du kan angive dit eget navn, hvis du foretrækker det.

Her er et eksempel på at angive et navn til den primære nøgle. I dette tilfælde angiver jeg også et ikke-klynget indeks.

BRUG PK_Test;CREATE TABLE Cats( CatId int IDENTITY (1,1) NOT NULL, CONSTRAINT PK_Cats_CatId PRIMÆR NØGLE IKKE KLUNDET (CatId), CatName varchar(50));

I dette tilfælde bruger jeg den valgfri CONSTRAINT nøgleord for at angive starten på definitionen af ​​den primære nøgle, efterfulgt af mit valgte navn til den primære nøgle. Jeg bruger også NONCLUSTERED nøgleord for at angive, at et ikke-klynget indeks.

Tjek den primære nøgle:

SELECT name, type, unique_index_id, is_system_namedFROM sys.key_constraintsWHERE type ='PK';

Resultat:

+-------------------------------------+--------+------ --------------+--------------------------+| navn | type | unikt_indeks_id | er_system_navngivet ||-------------------------------------+--------+------- ------------+--------------------------|| PK__Farver__8DA7674DD34F4585 | PK | 1 | 1 || PK_Cats_CatId | PK | 2 | 0 |+-------------------------------------+--------+------- ------------+---------------------------+

Tjek indekset:

VÆLG *FROM sys.indexesWHERE navn ='PK_Cats_CatId';

Resultat (ved hjælp af lodret output):

objekt_id | 917578307navn | PK_Cats_CatIdindex_id | 2type | 2type_desc | NONCLUSTEREDis_unik | 1data_space_id | 1ignore_dup_key | 0is_primary_key | 1is_unique_constraint | 0fill_factor | 0is_polstret | 0is_disabled | 0er_hypotetisk | 0is_ignored_in_optimization | 0allow_row_locks | 1allow_page_locks | 1har_filter | 0filter_definition | NULLcompression_delay | NULLsuppress_dup_key_messages | 0auto_created | 0

Så vi kan se, at denne gang type_desc er IKKELUSTERET .

Bemærk, at når du opretter en tabel, CLUSTERED kan kun specificeres for én begrænsning. Hvis det er angivet for en UNIQUE begrænsning og en PRIMARY KEY begrænsning er også specificeret, PRIMARY KEY er standard til NONCLUSTERED .

Eksempel 5 – Opret en primær nøgle på en nullbar kolonne

En primær nøgle kan kun oprettes for kolonner, der er defineret som NOT NULL . Hvis du forsøger at oprette en primær nøgle på en kolonne, der er sat til NULL , får du en fejl.

Men hvis du ikke angiver nullbarheden, er kolonnen sat til NOT NULL som standard.

For at demonstrere dette, lad os oprette en anden tabel, men denne gang sætter vi den til NULL :

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

Resultat:

Besked 8147, Niveau 16, Tilstand 1, Linje 3 Kunne ikke oprette IDENTITY-attribut på nullbar kolonne 'DogId', tabel 'Dogs'. Besked 8111, Niveau 16, Tilstand 1, Linje 3 Kan ikke definere PRIMÆR NØGLE-begrænsning på nullbar kolonne i tabellen 'Dogs'.Msg 1750, Level 16, State 0, Line 3 Kunne ikke oprette begrænsning eller indeks. Se tidligere fejl.

Som forventet får vi en fejl.

Lad os fjerne NULL fra tabeldefinitionen, og prøv igen:

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

Resultat:

Kommandoer fuldført. Samlet udførelsestid:00:00:00.015

Denne gang blev tabellen oprettet.

Lad os tage et kig på det:

SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identityFROM sys.columns cINNER JOIN sys.tables TON c.object_id =t.object_idWHERE c.name ='DogId';

Resultat:

+------------------------------- ------+| Tabel | Kolonne | er_nullbar | is_identity ||--------+--------------------------- -----|| Hunde | DogId | 0 | 1 |+------------------------------ -----+

Så vi kan se, at det ikke er nullbart, fordi is_nullable flag er sat til 0 .

Eksempel 6 – Primær nøgle på flere kolonner

Du kan også oprette en primær nøgle på flere kolonner. Primære nøgler med flere kolonner er også kendt som sammensatte primærnøgler. For at oprette en sammensat primærnøgle skal du blot adskille kolonnerne med et komma, når du definerer nøglen.

Sådan:

CONSTRAINT PK_Name PRIMÆR NØGLE (Kolonne1, Kolonne2)

Her er et eksempel på en situation, hvor en primærnøgle med flere kolonner kunne bruges:

CREATE TABLE Musiker (MusicianId int NOT NULL,FirstName varchar(60),Efternavn varchar(60),CONSTRAINT PK_Musician PRIMARY KEY (MusicianID));CREATE TABLE Band (BandId int NOT NULL,BandName varchar(255_BCONSTRAINT) 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 (BandIdicia)RINTEFERENICIAdMusic ) REFERENCER Musiker(MusikerId));

I dette eksempel er BandMember tabellen har en primær nøgle med flere kolonner. I dette tilfælde er hver kolonne i den primære nøgle også en fremmednøgle til den primære nøgle i en anden tabel, men dette er ikke et krav.

Se Sådan oprettes en sammensat primær nøgle i SQL Server for en mere detaljeret forklaring af dette eksempel.

Se også Sådan oprettes en sammensat fremmednøgle i SQL Server for et eksempel, der tager det et skridt videre med en fremmednøgle med flere kolonner, der refererer til ovenstående sammensatte primærnøgle.


  1. Tilføj ordensindikatoren til en dato i PostgreSQL

  2. Rekursiv forespørgsel brugt til transitiv lukning

  3. Hvordan indsætter man en post med kun standardværdier?

  4. Docker-container til Postgres 9.1 udsætter ikke port 5432 for værten