Tento článek ukazuje, jak přidat CHECK
omezení na existující tabulku.
Do existující tabulky můžete přidat omezení pomocí ALTER TABLE
spolu s ADD CONSTRAINT
argument. Příklady níže.
Příklad 1 – Vytvoření tabulky
Nejprve si vytvoříme tabulku, do které přidáme CHECK
omezení.
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 );
Příklad 2 – Přidání omezení na úrovni sloupce
Nyní přidáme CHECK
omezení na
Cenu
sloupec.
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Toto omezení zajistí, že cena bude vždy vyšší než nula.
Nyní, když bylo přidáno omezení, toto se stane, když se pokusíme vložit neplatná data:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
Výsledek:
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'.
V tomto případě CHECK
omezení určuje, že všechna data v Price
sloupec musí být větší než 0. Jinými slovy, cena nemůže být nula a nesmí být záporná.
Toto se nazývá omezení na úrovni sloupců , protože je definován na jednom sloupci. Platí pro data v jednom sloupci.
Příklad 3 – Přidání omezení na úrovni tabulky
Nyní přidáme CHECK
na úrovni tabulky omezení. Tím zkontrolujete data ve dvou sloupcích.
ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
V tomto případě přidávám omezení, které zajistí, že datum ukončení nemůže být nikdy dřívější než datum zahájení. Toto je kontrola dat ve dvou sloupcích, a proto je to omezení na úrovni tabulky.
Zkuste vložit neplatnou hodnotu:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
Výsledek:
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".
Podle očekávání se operace nezdaří, protože mé datum ukončení je dřívější než datum zahájení.
Všimněte si, že za účelem otestování tohoto omezení jsem musel zvýšit cenu na platnou hodnotu, abych zabránil spuštění předchozího omezení jako první (CHECK
omezení jsou ověřována v pořadí, v jakém jsou vytvořena).
Příklad 4 – Úspěšné vložení dat, která jsou v souladu s omezením
Abychom mohli úspěšně vložit řádek, vše, co musíme udělat, je ujistit se, že vkládáme platné hodnoty.
Příklad:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
Výsledek:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
Všimněte si, že
EventId
sloupec se již zvýšil na 4. Je to proto, že se jedná o IDENTITY
sloupec. Důležitá věc, kterou si o IDENTITY
zapamatujte sloupců je, že se zvyšují, i když omezení způsobí INSERT
operace se nezdaří.
Některá omezení omezení CHECK
Zde je několik omezení, na která je třeba pamatovat při práci s CHECK
omezení:
- Podmínka vyhledávání se musí vyhodnotit jako booleovský výraz a nemůže odkazovat na jinou tabulku.
- Výraz nemůže obsahovat datové typy aliasů.
CHECK
omezení nelze definovat pro text , ntext nebo obrázek sloupce.