sql >> Databáze >  >> RDS >> Sqlserver

Přidání omezení CHECK do existující tabulky v SQL Server (T-SQL)

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.

  1. Syntaxe vnějšího spojení Oracle ve starém stylu – Proč umístit (+) na pravou stranu znaménka rovná se v levém vnějším spojení?

  2. Získejte informace o zobrazení pomocí zobrazení informačního schématu VIEWS na serveru SQL Server

  3. Postgres case Sensitivity

  4. SQL dotaz na odstranění databáze v MySQL