Unika begränsningar och kontrollbegränsningar
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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 MyColumn
infogar 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.
Relaterade uppgifter
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 |