Sdílet prostřednictvím


Jedinečná omezení a omezení kontroly

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL 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 KEYUNIQUE 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 CheckTblmusí 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.

Ú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í