Dela via


Unika begränsningar och kontrollbegränsningar

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

UNIQUE begränsningar och CHECK begränsningar är två typer av begränsningar som kan användas för att framtvinga dataintegritet i SQL Server-tabeller. Det här är viktiga databasobjekt.

Den här artikeln innehåller följande avsnitt.

UNIKA begränsningar

Begränsningar är regler som SQL Server Database Engine tillämpar åt dig. Du kan till exempel använda UNIQUE begränsningar för att se till att inga duplicerade värden anges i specifika kolumner som inte deltar i en primärnyckel. Även om både en UNIQUE-begränsning och ett PRIMARY KEY villkor framtvingar unikhet använder du en UNIQUE begränsning i stället för en PRIMARY KEY begränsning när du vill framtvinga unikheten för en kolumn (eller kombination av kolumner) som inte är primärnyckeln.

Till skillnad från PRIMARY KEY begränsningar tillåter UNIQUE begränsningar värdet NULL. Men precis som med alla värden som deltar i ett UNIQUE villkor tillåts endast ett null-värde per kolumn. En UNIQUE begränsning kan refereras till av en FOREIGN KEY begränsning.

När en UNIQUE begränsning läggs till i en befintlig kolumn eller kolumner i tabellen undersöker databasmotorn som standard befintliga data i kolumnerna för att se till att alla värden är unika. Om en UNIQUE begränsning läggs till i en kolumn som har duplicerade värden returnerar databasmotorn ett fel och lägger inte till villkoret.

Databasmotorn skapar automatiskt ett UNIQUE index för att framtvinga kravet på unikhet för villkoret UNIQUE. Om ett försök att infoga en duplicerad rad görs returnerar databasmotorn därför ett felmeddelande som anger att UNIQUE-begränsningen överträddes och inte lägger till raden i tabellen. Såvida inte ett klustrat index uttryckligen anges skapas ett unikt, icke-grupperat index som standard för att framtvinga UNIQUE villkor.

CHECK-begränsningar

CHECK begränsningar framtvingar domänintegritet genom att begränsa de värden som accepteras av en eller flera kolumner. Du kan skapa ett CHECK villkor med alla logiska (booleska) uttryck som returnerar TRUE eller FALSE baserat på de logiska operatorerna. Till exempel kan intervallet med värden för en salary kolumn begränsas genom att skapa en CHECK begränsning som endast tillåter data som sträcker sig från 15 000 USD till 100 000 USD. Detta förhindrar att löner förs in utanför det vanliga löneintervallet. Det logiska uttrycket skulle vara följande: salary >= 15000 AND salary <= 100000.

Du kan använda flera CHECK begränsningar för en enda kolumn. Du kan också använda en enda CHECK begränsning för flera kolumner genom att skapa den på tabellnivå. Ett CHECK villkor med flera kolumner kan till exempel användas för att bekräfta att alla rader med ett kolumnvärde på country_region som är USA också har ett två tecken långt värde i kolumnen state. Detta gör att flera villkor kan kontrolleras på en plats.

CHECK begränsningar liknar FOREIGN KEY begränsningar eftersom de styr de värden som placeras i en kolumn. Skillnaden är hur de avgör vilka värden som är giltiga: FOREIGN KEY begränsningar hämtar listan över giltiga värden från en annan tabell, medan CHECK begränsningar fastställer giltiga värden från ett logiskt uttryck.

Försiktighet

Begränsningar som inkluderar implicit eller explicit datatypskonvertering kan leda till att vissa åtgärder misslyckas. Sådana begränsningar som definieras i tabeller som är källor för partitionsväxling kan till exempel orsaka att en ALTER TABLE...SWITCH åtgärd misslyckas. Undvik datatypkonvertering i villkorsdefinitioner.

Begränsningar av CHECK-villkor

CHECK:s begränsningar avvisar värden som bedöms motsvara FALSE. Eftersom null-värden utvärderas till OKÄND kan deras närvaro i uttryck åsidosätta en begränsning. Anta till exempel att du placerar en begränsning på en int kolumn MyColumn anger att MyColumn endast får innehålla värdet 10 (MyColumn=10). Om du infogar värdet NULL i MyColumninfogar databasmotorn NULL och returnerar inget fel.

Ett CHECK villkor returnerar TRUE när villkoret som kontrolleras inte är FALSE för någon rad i tabellen. Ett CHECK villkor fungerar på radnivå. Om en tabell som skapades inte har några rader anses alla CHECK begränsningar för den här tabellen vara giltiga. Den här situationen kan ge oväntade resultat, som i följande exempel.

CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO

CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
    DECLARE @retval INT;
    SELECT @retval = COUNT(*)
    FROM CheckTbl;

    RETURN @retval;
END;
GO

ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO

Villkoret CHECK som läggs till anger att det måste finnas minst en rad i tabellen CheckTbl. Men eftersom det inte finns några rader i tabellen för att kontrollera villkoret för den här begränsningen lyckas ALTER TABLE-instruktionen.

CHECK begränsningar verifieras inte under DELETE-instruktioner. Därför kan körning av DELETE-instruktioner på tabeller med vissa typer av kontrollvillkor ge oväntade resultat. Tänk dig till exempel följande instruktioner som körs i tabellen CheckTbl.

INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;

DELETE-instruktionen lyckas, även om CHECK-villkoret anger att tabellen CheckTbl måste ha minst 1 rad.

Not

Om tabellen publiceras för replikering måste du göra schemaändringar med hjälp av Transact-SQL-instruktionen ALTER TABLE eller SQL Server Management Objects (SMO). När schemaändringar görs med tabelldesignern eller databasdiagramdesignern försöker den släppa och återskapa tabellen. Du kan inte släppa publicerade objekt. Därför misslyckas schemaändringen.

Uppgift Artikel
Beskriver hur du skapar en unik begränsning. Skapa unika begränsningar
Beskriver hur du ändrar en unik begränsning. Ändra unika begränsningar
Beskriver hur du tar bort en unik begränsning. Ta bort unika begränsningar
Beskriver hur du skapar en kontrollbegränsning. Skapa kontrollbegränsningar
Beskriver hur du inaktiverar en kontrollbegränsning när en replikeringsagent infogar eller uppdaterar data i tabellen. Inaktivera kontrollbegränsningar för replikering
Beskriver hur du inaktiverar en kontrollbegränsning när data läggs till, uppdateras i eller tas bort från en tabell. Inaktivera kontrollbegränsningar med INSERT- och UPDATE-instruktioner
Beskriver hur du ändrar villkorsuttrycket eller de alternativ som aktiverar eller inaktiverar villkoret för specifika villkor. Ändra kontrollbegränsningar
Beskriver hur du tar bort en kontrollbegränsning. Ta bort kontrollbegränsningar
Beskriver hur du visar egenskaperna för en kontrollbegränsning. unika restriktioner och kontrollrestriktioner