Denne artikel viser, hvordan du tilføjer en CHECK
begrænsning til en eksisterende tabel.
Du kan tilføje en begrænsning til en eksisterende tabel ved at bruge ALTER TABLE
sætning sammen med ADD CONSTRAINT
argument. Eksempler nedenfor.
Eksempel 1 – Opret tabellen
Lad os først oprette en tabel, som vi tilføjer CHECK
til 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 );
Eksempel 2 – Tilføj en begrænsning på kolonneniveau
Lad os nu tilføje en CHECK
begrænsning til
Pris
kolonne.
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Denne begrænsning vil sikre, at prisen altid er større end nul.
Nu hvor begrænsningen er blevet tilføjet, sker der her, hvis vi forsøger at indsætte ugyldige 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 dette tilfælde er CHECK
begrænsning angiver, at alle data i Price
kolonne skal være større end 0. Med andre ord kan prisen ikke være nul, og den kan ikke være negativ.
Dette omtales som en restriktion på kolonneniveau , fordi det er defineret på en enkelt kolonne. Det gælder for data i én kolonne.
Eksempel 3 – Tilføj en begrænsning på tabelniveau
Lad os nu tilføje en CHECK
på tabelniveau begrænsning. Dette vil kontrollere data i to kolonner.
ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
I dette tilfælde tilføjer jeg en begrænsning for at sikre, at slutdatoen aldrig kan være tidligere end startdatoen. Dette kontrollerer data på tværs af to kolonner og er derfor en begrænsning på tabelniveau.
Prøv at indsætte en ugyldig værdi:
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 forventet mislykkes handlingen, fordi min slutdato er tidligere end startdatoen.
Bemærk, at for at teste denne begrænsning, var jeg nødt til at øge prisen til en gyldig værdi for at forhindre den tidligere begrænsning i at blive udløst først (CHECK
begrænsninger valideres i den rækkefølge, de oprettes).
Eksempel 4 – Indsættelse af data, der er i overensstemmelse med begrænsningen
For at kunne indsætte en række, skal vi bare sørge for, at vi indsætter gyldige værdier.
Eksempel:
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 | +-----------+-------------+-------------+------------+----------+
Bemærk, at
EventId
kolonne er allerede steget til 4. Dette skyldes, at det er en IDENTITY
kolonne. En vigtig ting at huske om IDENTITY
kolonner er, at de stiger, selv når en begrænsning forårsager en INSERT
operation mislykkes.
Nogle begrænsninger af CHECK-begrænsninger
Her er et par begrænsninger, du skal være opmærksom på, når du arbejder med CHECK
begrænsninger:
- Søgebetingelsen skal evalueres til et boolesk udtryk og kan ikke henvise til en anden tabel.
- Udtrykket kan ikke indeholde aliasdatatyper.
CHECK
begrænsninger kan ikke defineres på tekst , ntekst eller billede kolonner.