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

Přehled jedinečných omezení serveru SQL Server

Jaká jsou jedinečná klíčová omezení?

Jedinečné omezení je pravidlo, které omezuje položky sloupců na jedinečné. Jinými slovy, tento typ omezení zabraňuje vkládání duplikátů do sloupce. Jedinečné omezení je jedním z nástrojů k vynucení integrity dat v databázi SQL Server. Protože tabulka může mít pouze jeden primární klíč, můžete použít jedinečné omezení k vynucení jedinečnosti sloupce nebo kombinace sloupců, které netvoří primární klíč.

Vytvoření jedinečného omezení pro sloupec automaticky vytvoří jedinečný index. Tímto způsobem SQL Server implementuje požadavek na integritu jedinečného omezení. Proto při pokusu o vložení duplicitní hodnoty do sloupce, pro který je definováno jedinečné omezení, Database Engine zjistí porušení jedinečného omezení a vydá odpovídající chybu. V důsledku toho nebude řádek s duplicitními hodnotami přidán do tabulky.

Vytvoření jedinečného omezení

Následující ukázkový dotaz vytvoří Studenti tabulka a jedinečné omezení v Přihlášení tak, aby zde nebyli žádní studenti se stejným přihlášením.

VYTVOŘIT TABULKU Studenti (Přihlášení CHAR NOT NULL,CONSTRAINT AK_Student_Login UNIQUE (Přihlášení));GO

Pokud Studenti tabulka již existuje, můžete k vytvoření jedinečného omezení použít následující ukázkový dotaz.

ALTER TABLE StudentsADD CONSTRAINT AK_Student_Login UNIQUE (Login);GO

Všimněte si, že když přidáte jedinečné omezení do existující tabulky, Database Engine ověří, zda sloupec, do kterého je omezení přidáno, obsahuje duplicitní hodnoty. Pokud takové hodnoty existují, omezení nebude přidáno a vrátí chybu.

Nyní, abyste ověřili, že jedinečné omezení bylo skutečně přidáno, proveďte následující příkazy:

EXEC sp_helpindex StudentsEXEC sp_helpconstraint Studenti

Zde je omezení, které jsme vytvořili:

Vytvoření jedinečného omezení v SQL Server Management Studio

Řekněme, že potřebujeme definovat jedinečné omezení pro Přihlášení ve sloupci Studenti tabulka.

1. V Průzkumníku objektů , klikněte pravým tlačítkem na Studenti a klikněte na Návrh .

2. Klikněte pravým tlačítkem na Návrhář tabulek a zvolte Indexy/Klíče…

3. V části Indexy/klíče klikněte na tlačítko Přidat .

4. V části Obecné klikněte na Sloupce a potom klikněte na tlačítko se třemi tečkami. V Sloupcích indexu vyberte sloupce, které chcete zahrnout do jedinečného omezení.

5. V části Obecné klikněte na Typ a vyberte Jedinečný klíč z rozevíracího seznamu.

6. V části Identita sekce, zadejte název omezení (v našem případě AK_Student_Login ) a klikněte na Zavřít pro uložení nově vytvořeného omezení.

Nyní, když přejdete na Studenti tabulky v Průzkumníku objektů a klikněte na Indexy složku, uvidíte, že tabulka obsahuje primární klíč a jedinečné omezení AK_Student_Login .

Jak se jedinečná omezení liší od primárních klíčů?

Podobně jako u jedinečného omezení se primární klíč také používá k vynucení integrity dat v tabulce. Primárním účelem primárního klíče je však jednoznačně identifikovat každý záznam v tabulce a implementovat správné vztahy mezi tabulkami v databázi. Primární klíč je vyžadován v 99 % tabulek, aby byl umožněn správný přístup k řádkům tabulky. Pro jednu tabulku může být definován pouze jeden primární klíč v jednom nebo více sloupcích.

Jedinečná omezení se specificky používají k zabránění vkládání duplicitních hodnot do sloupce. Může existovat několik sloupců s jedinečnými omezeními nebo nemusí být v tabulce definována žádná jedinečná omezení. Na rozdíl od primárních klíčů nejsou pro tabulku povinné.

Řekněme, že máme Studenty tabulka obsahující osobní údaje o každém studentovi na univerzitě. Tabulka obsahuje StudentID sloupec, který je primárním klíčem a ukládá jedinečné ID každého konkrétního studenta. Tento sloupec primárního klíče se používá k jedinečné identifikaci každého studenta na univerzitě.

Zároveň Studenti tabulka obsahuje sloupce jako E-mail , Číslo sociálního zabezpečení a Přihlásit se a každý z těchto sloupců musí obsahovat jedinečné hodnoty. Vzhledem k tomu, že v tabulce již jeden primární klíč je, použijeme místo toho jedinečná omezení k zavedení jedinečnosti těchto sloupců. Tabulka tedy může mít mnoho jedinečných omezení a pouze jeden primární klíč.

Další věc, která se od primárního klíče liší jedinečným omezením, je to, že primární klíč neumožňuje žádné NULL hodnoty ve sloupci, zatímco sloupec s jedinečným omezením může obsahovat NULL hodnotu, ale pouze jednu, protože SQL Server interpretuje dvě hodnoty NULL jako stejné hodnoty.

Předpokládejme, že v E-mailu je vytvořeno jedinečné omezení ve sloupci Studenti stůl. Zkusme vložit dva řádky oba s NULL s v E-mailu pole:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')GO

Zobrazí se následující chybová zpráva:

Toto je předvídatelné chování, protože duplicitní hodnoty, i když jsou NULL, nejsou povoleny jedinečným omezením.

Jedinečné omezení vs jedinečný index

Ačkoli jak jedinečné omezení, tak jedinečný index jsou dvě zcela odlišné nesouvisející databázové entity, mají stejný cíl a stejný dopad na výkon SQL Server. Oba zajišťují jedinečnost dat ve sloupci.

Na rozdíl od jedinečného indexu však nemůžete zadat možnosti IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX a STATISTICS_NORECOMPUTE pro jedinečné omezení v příkazech ALTER TABLE.

Když vytvoříte jedinečné omezení pro sloupec, SQL Server automaticky vytvoří jedinečný index ve sloupci, takto je tato funkce implementována v SQL Server.

Chcete-li odstranit jedinečný index, musíte nejprve zrušit odpovídající jedinečné omezení a tím se automaticky odstraní základní jedinečný index.

Následující prohlášení zruší AK_Student_Login omezení:

ALTER TABLE Studenti DROP CONSTRAINT AK_Student_Login; GO

Můžete vidět, že vynechání AK_Student_Login Jedinečné omezení odstraní svůj odpovídající index.

To bylo snadné, nyní můžete vložit stejné hodnoty do Přihlášení sloupec.

Deaktivace jedinečného omezení

Existuje možnost, která zakáže jedinečné omezení. Následující dotaz má zakázat všechna omezení tabulky:

ALTER TABLE StudentiNOCHECK CONSTRAINT ALLGO

Po provedení dotazu se nyní pokusme vložit duplicitní záznam:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')GO

Dostaneme jedinečnou zprávu o porušení omezení:

Zdá se tedy, že ALTER TABLE NOCHECK CONSTRAINT ALL GO nefunguje pro jedinečná omezení v SQL Server.

Pamatujte však, že pod kapotou každého jedinečného omezení je jedinečný index a měli bychom být schopni zakázat jedinečný index. V našem případě AK_Student_Email Jedinečné omezení vytvořilo odpovídající AK_Student_Email jedinečný index na e-mailu sloupec. Pomocí následujícího dotazu deaktivujeme AK_Student_Email jedinečný index jako první.

ALTER INDEX AK_Student_Email ON StudentsDISABLE;

Dotaz byl úspěšně dokončen, takže nyní vložíme dva záznamy s duplicitním e-mailem pole do Studenti tabulka.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')GO 
INSERT INTO Students (ID_studenta, jméno, věk, e-mail, SSN, přihlášení) VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')GO 

Funguje to! Záznamy byly vloženy do tabulky! Nyní víme, jak tento problém „vyřazení“ obejít pomocí jedinečného omezení.

Chcete-li povolit index, použijte následující dotaz:

ALTER INDEX AK_Student_Email ON StudentsREBUILD;

Závěr

Jedinečná klíčová omezení umožňují správcům databází a vývojářům SQL vynutit a zachovat jedinečnost dat ve sloupcích tabulky a také aplikovat určité obchodní požadavky na integritu dat. V zásadě neexistuje žádný podstatný rozdíl v chování mezi jedinečným omezením a jedinečným indexem, kromě skutečnosti, že jedinečné omezení nelze přímo deaktivovat a určité možnosti vytvoření indexu nejsou dostupné pro jedinečná omezení v příkazu ALTER TABLE.

Doufám, že tento článek byl zajímavý. Můžete klást otázky, zanechávat komentáře a návrhy týkající se tohoto článku.

Viz také: ZKONTROLUJTE Omezení v SQL Server


  1. Porovnejte DATETIME a DATE s ignorováním časové části

  2. Jak monitorovat více instancí MySQL běžících na stejném počítači – tipy a triky ClusterControl

  3. Jak zakázat změnu sběru dat (CDC) v databázi na serveru SQL - kurz SQL Server

  4. Jak mohu vložit 10 milionů záznamů v co nejkratším čase?