Den här artikeln visar hur man lägger till en CHECK
begränsning till en befintlig tabell.
Du kan lägga till en begränsning till en befintlig tabell genom att använda ALTER TABLE
sats tillsammans med ADD CONSTRAINT
argument. Exempel nedan.
Exempel 1 – Skapa tabellen
Låt oss först skapa en tabell som vi lägger till CHECK
för begränsning.
CREATE TABLE Event ( EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY, EventName varchar(255) NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, Price smallmoney NOT NULL );
Exempel 2 – Lägg till en begränsning på kolumnnivå
Låt oss nu lägga till en CHECK
begränsning till
Pris
kolumn.
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Denna begränsning säkerställer att priset alltid är högre än noll.
Nu när begränsningen har lagts till, här är vad som händer om vi försöker infoga ogiltiga data:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
Resultat:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.
I det här fallet, CHECK
begränsning anger att all data i Price
kolumnen måste vara större än 0. Med andra ord kan priset inte vara noll och det får inte vara negativt.
Detta kallas för en restriktion på kolumnnivå , eftersom den är definierad i en enda kolumn. Det gäller data i en kolumn.
Exempel 3 – Lägg till en begränsning på tabellnivå
Låt oss nu lägga till en CHECK
på tabellnivå begränsning. Detta kommer att kontrollera data i två kolumner.
ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
I det här fallet lägger jag till en begränsning för att säkerställa att slutdatumet aldrig kan vara tidigare än startdatumet. Detta kontrollerar data över två kolumner och är därför en begränsning på tabellnivå.
Försök att infoga ett ogiltigt värde:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
Resultat:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".
Som väntat misslyckas operationen eftersom mitt slutdatum är tidigare än startdatumet.
Observera att för att testa denna begränsning var jag tvungen att höja priset till ett giltigt värde för att förhindra att den tidigare begränsningen utlöses först (CHECK
begränsningar valideras i den ordning de skapas).
Exempel 4 – framgångsrikt infoga data som överensstämmer med begränsningen
För att lyckas infoga en rad behöver vi bara se till att vi infogar giltiga värden.
Exempel:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
Resultat:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
Observera att
EventId
kolumnen har redan ökat till 4. Detta beror på att det är en IDENTITY
kolumn. En viktig sak att komma ihåg om IDENTITY
kolumner är att de ökar även när en begränsning orsakar en INSERT
operation misslyckas.
Några begränsningar av CHECK-begränsningar
Här är några begränsningar att tänka på när du arbetar med CHECK
begränsningar:
- Sökvillkoret måste utvärderas till ett booleskt uttryck och kan inte referera till en annan tabell.
- Uttrycket kan inte innehålla aliasdatatyper.
CHECK
begränsningar kan inte definieras på text , ntext , eller bild kolumner.