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

Indsigt i SQL Server Unique Constraints

Hvad er unikke nøglebegrænsninger?

En unik begrænsning er en regel, der begrænser kolonneindtastninger til unikke. Med andre ord forhindrer denne type begrænsninger at indsætte dubletter i en kolonne. En unik begrænsning er et af instrumenterne til at håndhæve dataintegritet i en SQL Server-database. Da en tabel kun kan have én primær nøgle, kan du bruge en unik begrænsning til at gennemtvinge en kolonnes unikke karakter eller en kombination af kolonner, der ikke udgør en primær nøgle.

Oprettelse af en unik begrænsning på en kolonne opretter automatisk et unikt indeks. På denne måde implementerer SQL Server integritetskravet til den unikke begrænsning. Derfor, når du forsøger at indsætte en dubletværdi i en kolonne, hvorpå der er defineret en unik begrænsning, vil databasemotoren registrere den unikke begrænsningsovertrædelse og udstede en tilsvarende fejl. Som følge heraf vil rækken med de duplikerede værdier ikke blive tilføjet til en tabel.

Oprettelse af en unik begrænsning

Følgende eksempelforespørgsel opretter Studenter tabel og en unik begrænsning på Login kolonne, så der ikke er elever med samme login.

CREATE TABLE Students (
Login CHAR NOT NULL
,CONSTRAINT AK_Student_Login UNIQUE (Login)
);
GO

Hvis Studerende tabel allerede eksisterer, så kan du bruge følgende eksempelforespørgsel til at oprette den unikke begrænsning.

ALTER TABLE Students
ADD CONSTRAINT AK_Student_Login UNIQUE (Login);
GO

Bemærk, at når du tilføjer en unik begrænsning til en eksisterende tabel, verificerer databasemotoren, om kolonnen, som begrænsningen er tilføjet, indeholder duplikerede værdier. Hvis der er sådanne værdier, vil begrænsningen ikke blive tilføjet og returnere en fejl.

For nu at bekræfte, at den unikke begrænsning faktisk er blevet tilføjet, skal du udføre følgende sætninger:

EXEC sp_helpindex Students

EXEC sp_helpconstraint Students

Her er den begrænsning, vi har oprettet:

Oprettelse af en unik begrænsning i SQL Server Management Studio

Lad os sige, at vi skal definere en unik begrænsning på Login kolonne den Studenter tabel.

1. I Object Explorer , højreklik på Studenter tabel og klik på Design .

2. Højreklik på Tabeldesigneren og vælg Indekser/nøgler...

3. I Indekser/nøgler vindue, skal du klikke på Tilføj .

4. Under Generelt skal du klikke på Kolonner og klik derefter på ellipseknappen. I Indekskolonner vindue, skal du vælge den eller de kolonner, som du vil inkludere i den unikke begrænsning.

5. Under Generelt skal du klikke på Skriv og vælg Unik nøgle fra rullelisten.

6. Under Identitet sektion, angiv navnet på begrænsningen (i vores tilfælde AK_Student_Login ), og klik på Luk for at gemme den nyoprettede begrænsning.

Nu, hvis du går til Studenter tabel i Object Explorer og klik på Indekser mappe, vil du se, at tabellen indeholder en primær nøgle og en unik begrænsning AK_Student_Login .

Hvordan er unikke begrænsninger forskellige fra primære nøgler?

I lighed med en unik begrænsning bruges en primær nøgle også til at håndhæve dataintegritet i en tabel. Men det primære formål med en primær nøgle er entydigt at identificere hver post i en tabel og implementere korrekte relationer mellem tabeller i en database. En primær nøgle er påkrævet i 99 % af tabellerne for at tillade korrekt adgang til tabelrækker. Der kan kun være én primær nøgle pr. tabel defineret på én eller flere kolonner.

Unikke begrænsninger bruges specifikt til at forhindre duplikerede værdier i at blive indsat i en kolonne. Der kan være flere kolonner med unikke begrænsninger, eller der er muligvis ingen unikke begrænsninger defineret på en tabel overhovedet. De er ikke obligatoriske for en tabel i modsætning til primærnøgler.

Lad os sige, at vi har Eleverne tabel med personlige oplysninger om hver enkelt studerende på et universitet. Tabellen inkluderer StudentID kolonne, som er en primær nøgle og gemmer et unikt ID for hver specifik elev. Denne primære nøglekolonne bruges til entydigt at identificere hver studerende på et universitet.

Samtidig er Studerende tabel har sådanne kolonner som E-mail , cpr-nummer og Login og hver af disse kolonner skal gemme unikke værdier. Da der allerede er én primær nøgle i tabellen, vil vi bruge unikke begrænsninger i stedet for at pålægge disse kolonner entydighed. En tabel kan således have mange unikke begrænsninger og kun én primær nøgle.

En anden ting, der adskiller en unik begrænsning fra en primær nøgle, er, at den primære nøgle ikke tillader nogen NULL værdier i en kolonne, hvorimod en kolonne med en unik begrænsning kan indeholde en NULL værdi, men kun én, da SQL Server fortolker to NULL-værdier som de samme værdier.

Antag, at der oprettes en unik begrænsning på E-mail kolonne i Studenter bord. Lad os prøve at indsætte to rækker begge med NULL s i E-mail felter:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')

GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')

GO

Vi får følgende fejlmeddelelse:

Nå, dette er en forudsigelig adfærd, fordi duplikerede værdier, selvom de er NULL'er, ikke er tilladt af den unikke begrænsning.

Unik begrænsning vs Unikt indeks

Selvom både den unikke begrænsning og det unikke indeks er to helt forskellige urelaterede databaseenheder, har de det samme mål og den samme indflydelse på SQL Server-ydeevnen. De sikrer begge dataentydighed i en kolonne.

I modsætning til det unikke indeks kan du dog ikke angive IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX og STATISTICS_NORECOMPUTE mulighederne for den unikke begrænsning i ALTER TABLE-sætningerne.

Når du opretter en unik begrænsning på en kolonne, opretter SQL Server automatisk et unikt indeks på kolonnen, det er bare sådan, denne funktion er implementeret i SQL Server.

For at slette det unikke indeks skal du først slippe den tilsvarende unikke begrænsning, og dette vil automatisk slette det underliggende unikke indeks.

Følgende erklæring vil slette AK_Student_Login begrænsning:

ALTER TABLE Students 
DROP CONSTRAINT AK_Student_Login; 
GO

Du kan se, at du slipper AK_Student_Login unik begrænsning sletter dets tilsvarende indeks.

Det var nemt, nu kan du indsætte identiske værdier i Login kolonne.

Deaktivering af unik begrænsning

Der er en mulighed, der deaktiverer en unik begrænsning. Følgende forespørgsel skal deaktivere alle tabelbegrænsningerne:

ALTER TABLE Students
NOCHECK CONSTRAINT ALL
GO

Efter at have udført forespørgslen, lad os nu prøve at indsætte en duplikerende post:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')
GO

Det, vi får, er den unikke meddelelse om overtrædelse af begrænsninger:

Det ser således ud til, at ALTER TABLE

NOCHECK CONSTRAINT ALL GO ikke virker for unikke begrænsninger i SQL Server.

Husk dog, at der er et unikt indeks under hætten for hver unik begrænsning, og vi burde være i stand til at deaktivere et unikt indeks. I vores tilfælde er AK_Student_Email unik begrænsning har skabt den tilsvarende AK_Student_Email unikt indeks på E-mail kolonne. Lad os bruge følgende forespørgsel til at deaktivere AK_Student_Email unikt indeks først.

ALTER INDEX AK_Student_Email ON Students
DISABLE;

Forespørgslen er gennemført med succes, så lad os nu indsætte to poster med dublet e-mail felter i Studenter tabel.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')
GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')
GO

Det virker! Posterne er indsat i tabellen! Nu ved vi, hvordan vi kan omgå dette "deaktivering"-problem med en unik begrænsning.

For at aktivere indekset skal du bruge følgende forespørgsel:

ALTER INDEX AK_Student_Email ON Students
REBUILD;

Konklusion

Unikke nøglebegrænsninger giver DBA'er og SQL-udviklere mulighed for at håndhæve og bevare dataentydighed i tabelkolonner samt anvende visse forretningskrav til dataintegritet. Grundlæggende er der ingen væsentlig forskel i adfærd mellem en unik begrænsning og et unikt indeks, bortset fra det faktum, at den unikke begrænsning ikke kan deaktiveres direkte, og visse indeksoprettelsesmuligheder er ikke tilgængelige for unikke begrænsninger i ALTER TABLE-sætningen.

Håber denne artikel var interessant. Du kan stille spørgsmål, efterlade kommentarer og forslag vedrørende denne artikel.

Se også: KONTROLLER begrænsninger i SQL Server


  1. MariaDB LTRIM() vs LTRIM_ORACLE():Hvad er forskellen?

  2. Sikkerhedskopier en enkelt tabel med dens data fra en database i sql server 2008

  3. Sådan opretter du et forhold i MySQL Workbench

  4. To skillende Ejendommeligheder