sql >> Databasteknik >  >> RDS >> Sqlserver

Insikt i SQL Server Unique Constraints

Vad är unika nyckelbegränsningar?

En unik begränsning är en regel som begränsar kolumnposter till unika. Med andra ord förhindrar denna typ av begränsningar att infoga dubbletter i en kolumn. En unik begränsning är ett av instrumenten för att upprätthålla dataintegritet i en SQL Server-databas. Eftersom en tabell bara kan ha en primärnyckel kan du använda en unik begränsning för att framtvinga unikheten hos en kolumn eller en kombination av kolumner som inte utgör en primärnyckel.

Att skapa en unik begränsning på en kolumn skapar automatiskt ett unikt index. På detta sätt implementerar SQL Server integritetskravet för den unika begränsningen. Därför, när man försöker infoga ett duplikatvärde i en kolumn, där en unik begränsning är definierad, kommer databasmotorn att upptäcka den unika begränsningsöverträdelsen och utfärda ett motsvarande fel. Som ett resultat kommer raden med dubblettvärdena inte att läggas till i en tabell.

Skapa en unik begränsning

Följande exempelfråga skapar eleverna tabellen och en unik begränsning på Login kolumnen så att det inte finns några elever med samma inloggning.

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

Om eleverna Tabellen redan finns, då kan du använda följande exempelfråga för att skapa den unika begränsningen.

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

Observera att när du lägger till en unik begränsning i en befintlig tabell, verifierar databasmotorn om kolumnen som begränsningen läggs till innehåller dubblerade värden. Om det finns sådana värden kommer begränsningen inte att läggas till och returnera ett fel.

Nu, för att verifiera att den unika begränsningen faktiskt har lagts till, kör följande satser:

EXEC sp_helpindex Students

EXEC sp_helpconstraint Students

Här är begränsningen vi har skapat:

Skapa en unik begränsning i SQL Server Management Studio

Låt oss säga att vi måste definiera en unik begränsning för Login kolumn i Studenter bord.

1. I Objektutforskaren högerklicka på Studenter tabell och klicka på Design .

2. Högerklicka på Table Designer och välj Index/nycklar...

3. I Index/nycklar klicka på Lägg till .

4. Under Allmänt klickar du på Kolumner och klicka sedan på ellipsknappen. I Indexkolumner fönster, välj den eller de kolumner som du vill inkludera i den unika begränsningen.

5. Under Allmänt klickar du på Typ och välj Unik nyckel från rullgardinsmenyn.

6. Under Identitet sektion, ange namnet på begränsningen (i vårt fall, AK_Student_Login ) och klicka på Stäng för att spara den nyskapade begränsningen.

Nu, om du går till Studenter tabell i Objektutforskaren och klicka på Index mapp kommer du att se att tabellen innehåller en primärnyckel och en unik begränsning AK_Student_Login .

Hur skiljer sig unika begränsningar från primärnycklar?

I likhet med en unik begränsning används en primärnyckel också för att framtvinga dataintegritet i en tabell. Men det primära syftet med en primärnyckel är att unikt identifiera varje post i en tabell och implementera korrekta relationer mellan tabeller i en databas. En primärnyckel krävs i 99 % av tabellerna för att ge korrekt åtkomst till tabellrader. Det kan bara finnas en primärnyckel per tabell definierad på en eller flera kolumner.

Unika begränsningar används specifikt för att förhindra att dubbla värden infogas i en kolumn. Det kan finnas flera kolumner med unika begränsningar eller så finns det inga unika begränsningar definierade i en tabell alls. De är inte obligatoriska för en tabell i motsats till primärnycklar.

Låt oss säga att vi har studenterna tabell som innehåller personlig information om varje student vid ett universitet. Tabellen innehåller StudentID kolumn som är en primärnyckel och lagrar ett unikt ID för varje specifik elev. Denna primärnyckelkolumn används för att unikt identifiera varje student vid ett universitet.

Samtidigt är studenterna tabellen har sådana kolumner som E-post , personnummer och Logga in och var och en av dessa kolumner måste lagra unika värden. Eftersom det redan finns en primärnyckel i tabellen kommer vi att använda unika begränsningar istället för att införa unika egenskaper för dessa kolumner. Således kan en tabell ha många unika begränsningar och bara en primärnyckel.

En annan sak som skiljer en unik begränsning från en primärnyckel är att primärnyckeln inte tillåter någon NULL värden i en kolumn, medan en kolumn med en unik begränsning kan innehålla en NULL värde men bara ett eftersom SQL Server tolkar två NULL-värden som samma värden.

Anta att en unik begränsning skapas på e-post kolumnen i Studenter tabell. Låt oss försöka infoga två rader båda med NULL s i e-post fält:

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öljande felmeddelande:

Tja, detta är ett förutsägbart beteende, eftersom dubbletter av värden, även om de är NULLs, inte tillåts av den unika begränsningen.

Unik begränsning kontra unikt index

Även om både den unika begränsningen och det unika indexet är två helt olika orelaterade databasenheter, har de samma mål och samma inverkan på SQL Server-prestanda. Båda säkerställer att data är unika i en kolumn.

Men till skillnad från det unika indexet kan du inte ange alternativen IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX och STATISTICS_NORECOMPUTE för den unika begränsningen i ALTER TABLE-satserna.

När du skapar en unik begränsning på en kolumn, skapar SQL Server automatiskt ett unikt index på kolumnen, det är bara så den här funktionen implementeras i SQL Server.

För att ta bort det unika indexet måste du först släppa motsvarande unika begränsning och detta kommer automatiskt att ta bort det underliggande unika indexet.

Följande uttalande kommer att ta bort AK_Student_Login begränsning:

ALTER TABLE Students 
DROP CONSTRAINT AK_Student_Login; 
GO

Du kan se det när du släpper AK_Student_Login unik begränsning tar bort motsvarande index.

Det var enkelt, nu kan du infoga identiska värden i Login kolumn.

Inaktivera Unique Constraint

Det finns ett alternativ som inaktiverar en unik begränsning. Följande fråga är tänkt att inaktivera alla tabellbegränsningar:

ALTER TABLE Students
NOCHECK CONSTRAINT ALL
GO

Efter att ha utfört frågan, låt oss nu försöka infoga en dupliceringspost:

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

Vad vi får är det unika meddelandet om överträdelse av begränsningar:

Det verkar alltså som om ALTER TABLE NOCHECK CONSTRAINT ALL GO inte fungerar för unika begränsningar i SQL Server.

Kom dock ihåg att det finns ett unikt index under huven för varje unik begränsning, och vi bör kunna inaktivera ett unikt index. I vårt fall är AK_Student_Email unik begränsning har skapat motsvarande AK_Student_Email unikt index på e-post kolumn. Låt oss använda följande fråga för att inaktivera AK_Student_Email unikt index först.

ALTER INDEX AK_Student_Email ON Students
DISABLE;

Frågan har slutförts framgångsrikt, så låt oss nu infoga två poster med dubblett av e-post fälten i Studenter bord.

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 fungerar! Posterna har infogats i tabellen! Nu vet vi hur vi ska komma runt detta "inaktiveringsproblem" med en unik begränsning.

För att aktivera indexet, använd följande fråga:

ALTER INDEX AK_Student_Email ON Students
REBUILD;

Slutsats

Unika nyckelbegränsningar tillåter DBA:er och SQL-utvecklare att genomdriva och bevara dataunikitet i tabellkolumner, samt tillämpa vissa affärskrav för dataintegritet. I grund och botten finns det ingen väsentlig skillnad i beteende mellan en unik begränsning och ett unikt index, förutom det faktum att den unika begränsningen inte kan inaktiveras direkt och vissa alternativ för att skapa index är inte tillgängliga för unika begränsningar i ALTER TABLE-satsen.

Hoppas denna artikel var intressant. Du kan ställa frågor, lämna kommentarer och förslag angående den här artikeln.

Se även: KONTROLLERA begränsningar i SQL Server


  1. Hur du skyddar din MySQL- och MariaDB-databas mot cyberattacker när du är på ett offentligt nätverk

  2. Query Store:Visar effekten av index på inlägg

  3. GROUP BY i UPDATE FROM-satsen

  4. Postgresql GROUP_CONCAT motsvarande?