Jedinečná omezení a omezení kontroly
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Database v Microsoft Fabric
UNIQUE
omezení a CHECK
omezení jsou dva typy omezení, které lze použít k vynucení integrity dat v tabulkách SQL Serveru. Jedná se o důležité databázové objekty.
Tento článek obsahuje následující části.
Jedinečná omezení
Omezení jsou pravidla, která pro vás databázový stroj SQL Serveru vynucuje. Můžete například použít UNIQUE
omezení, abyste měli jistotu, že do konkrétních sloupců, které se neúčastní primárního klíče, nezadávají žádné duplicitní hodnoty. I když omezení UNIQUE
i omezení PRIMARY KEY
vynucují jedinečnost, použijte místo omezení PRIMARY KEY
omezení UNIQUE
, pokud chcete vynutit jedinečnost sloupce (nebo kombinace sloupců), který není primárním klíčem.
Na rozdíl od omezení PRIMARY KEY
UNIQUE
omezení umožňují hodnotu NULL
. Stejně jako u jakékoli hodnoty, která se účastní omezení UNIQUE
, je pro každý sloupec povolena pouze jedna hodnota null. Omezení UNIQUE
může být odkazováno omezením FOREIGN KEY
.
Když se do existujícího sloupce nebo sloupců v tabulce přidá omezení UNIQUE
, databázový stroj ve výchozím nastavení zkontroluje existující data ve sloupcích, aby se ujistil, že jsou všechny hodnoty jedinečné. Pokud je do sloupce s duplicitními hodnotami přidáno omezení UNIQUE
, databázový stroj vrátí chybu a nepřidá omezení.
Databázový stroj automaticky vytvoří index UNIQUE
, který vynutí požadavek na jedinečnost omezení UNIQUE
. Proto pokud se provede pokus o vložení duplicitního řádku, databázový stroj vrátí chybovou zprávu s oznámením, že došlo k porušení omezení UNIQUE
a nepřidá řádek do tabulky. Pokud není explicitně zadán clusterovaný index, vytvoří se ve výchozím nastavení jedinečný neclusterovaný index, který vynucuje omezení UNIQUE
.
Omezení CHECK
CHECK
omezení zajišťují integritu domény tím, že omezují hodnoty, které mohou být přijaty jedním nebo více sloupci. Omezení CHECK
můžete vytvořit pomocí libovolného logického výrazu, který vrátí TRUE
nebo FALSE
na základě logických operátorů. Například rozsah hodnot pro sloupec salary
může být omezen vytvořením omezení CHECK
, které umožňuje pouze data, která jsou v rozsahu od 15 000 Kč do 100 000 Kč. Tím zabráníte zadávání platů nad rámec běžného rozsahu platů. Logický výraz by byl následující: salary >= 15000 AND salary <= 100000
.
U jednoho sloupce můžete použít více omezení CHECK
. Můžete také použít jedno omezení CHECK
na více sloupců tak, že ho vytvoříte na úrovni tabulky. Například omezení CHECK
s více sloupci se dá použít k potvrzení, že každý řádek s country_region
hodnotou sloupce USA
má ve sloupci state
hodnotu se dvěma znaky. To umožňuje zkontrolovat více podmínek na jednom místě.
CHECK
omezení se podobají omezením FOREIGN KEY
v tom, že řídí hodnoty vložené do sloupce. Rozdíl spočívá v tom, jak určují platné hodnoty: FOREIGN KEY
omezení získávají seznam platných hodnot z jiné tabulky, zatímco CHECK
omezení určují platné hodnoty z logického výrazu.
Opatrnost
Omezení, která zahrnují implicitní nebo explicitní převod datového typu, můžou způsobit selhání určitých operací. Taková omezení definovaná například u tabulek, které jsou zdroji přepínání oddílů, může způsobit selhání operace ALTER TABLE...SWITCH
. Vyhněte se převodu datových typů v definicích omezení.
Omezení podmínek CHECK
Omezení CHECK
odmítnou hodnoty, které se vyhodnotí jako FALSE
. Vzhledem k tomu, že hodnoty null se vyhodnocují jako NEZNÁMÉ, může jejich přítomnost ve výrazech přepsat omezení. Předpokládejme například, že umístíte omezení na sloupec intMyColumn
určující, že MyColumn
může obsahovat pouze hodnotu 10 (MyColumn=10
). Pokud vložíte hodnotu NULL
do MyColumn
, databázový stroj vloží NULL
a nevrátí chybu.
Omezení CHECK
vrátí TRUE
, když podmínka, která kontroluje, není FALSE
pro žádný řádek v tabulce. Omezení CHECK
funguje na úrovni řádku. Pokud vytvořená tabulka neobsahuje žádné řádky, považuje se za platné jakékoli omezení CHECK
této tabulky. Tato situace může vést k neočekávaným výsledkům, jako v následujícím příkladu.
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
Přidání omezení CHECK
určuje, že v tabulce CheckTbl
musí existovat alespoň jeden řádek . Vzhledem k tomu, že v tabulce nejsou žádné řádky, proti kterým chcete zkontrolovat podmínku tohoto omezení, příkaz ALTER TABLE
bude úspěšný.
CHECK
omezení nejsou ověřována během příkazů DELETE
. Proto provádění příkazů DELETE
v tabulkách s určitými typy omezení kontroly může vést k neočekávaným výsledkům. Představte si například následující příkazy spuštěné v tabulce CheckTbl
.
INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;
Příkaz DELETE
bude úspěšný, i když omezení CHECK
určuje, že CheckTbl
tabulky musí mít alespoň 1
řádek.
Poznámka
Pokud je tabulka publikovaná pro replikaci, je nutné provést změny schématu pomocí příkazu Transact-SQL ALTER TABLE nebo SMO (SQL Server Management Objects). Když se pomocí Návrháře tabulek nebo Návrháře diagramu databáze provede změny schématu, pokusí se tabulku odstranit a znovu vytvořit. Publikované objekty nelze odstranit, proto změna schématu selže.
Související úkoly
Úkol | Článek |
---|---|
Popisuje, jak vytvořit jedinečné omezení. | vytvořit jedinečná omezení |
Popisuje, jak upravit jedinečné omezení. | upravit jedinečná omezení |
Popisuje, jak odstranit jedinečné omezení. | odstranit jedinečná omezení |
Popisuje, jak vytvořit omezení kontroly. | Vytvoření Kontrolních Omezení |
Popisuje, jak zakázat omezení kontroly, když agent replikace vloží nebo aktualizuje data v tabulce. | Zakázat kontrolní omezení pro replikaci |
Popisuje, jak zakázat omezení kontroly při přidání, aktualizaci nebo odstranění dat z tabulky. | Zakázat omezení kontroly pomocí příkazů INSERT a UPDATE |
Popisuje, jak změnit výraz omezení nebo možnosti, které povolují nebo zakazují omezení pro konkrétní podmínky. | Upravit omezení kontrol |
Popisuje, jak odstranit omezení kontroly. | Odstranit kontrolní omezení |
Popisuje, jak zobrazit vlastnosti omezení kontroly. | jedinečná omezení a kontrolní omezení |