Omezení v SQL Server jsou předdefinovaná pravidla, která můžete vynutit na jednom nebo více sloupcích. Tato omezení pomáhají udržovat integritu, spolehlivost a přesnost hodnot uložených v těchto sloupcích. Omezení můžete vytvořit pomocí příkazů CREATE TABLE nebo ALTER Table. Pokud použijete příkaz ALTER TABLE, SQL Server před vytvořením omezení zkontroluje existující data sloupců.
Pokud vložíte data do sloupce, který splňuje kritéria pravidla omezení, SQL Server vloží data úspěšně. Pokud však data poruší omezení, příkaz insert se přeruší s chybovou zprávou.
Předpokládejme například, že máte tabulku [Zaměstnanec], ve které jsou uložena data zaměstnanců vaší organizace, včetně jejich platu. Existuje několik základních pravidel, pokud jde o hodnoty ve sloupci plat.
- Sloupec nemůže obsahovat záporné hodnoty, jako je -10 000 nebo -15 000 USD.
- Chcete také zadat maximální hodnotu platu. Například maximální plat by měl být nižší než 2 000 000 USD.
Pokud vložíte nový záznam s omezením, SQL Server ověří hodnotu podle definovaných pravidel.
Vložená hodnota:
Plat 80 000:úspěšně vložen
Plat -50 000: Chyba
V tomto článku prozkoumáme následující omezení v SQL Server.
- NENÍ NULL
- JEDINEČNÉ
- ZKONTROLUJTE
- PRIMÁRNÍ KLÍČ
- ZAHRANIČNÍ KLÍČ
- VÝCHOZÍ
NENÍ NULL omezení
Ve výchozím nastavení SQL Server umožňuje ukládání hodnot NULL do sloupců. Tyto hodnoty NULL nepředstavují platná data.
Například každý zaměstnanec v organizaci musí mít Emp ID, jméno, pohlaví a adresu. Proto můžete zadat sloupec s omezeními NOT NULL, abyste vždy zajistili platné hodnoty.
Níže uvedený skript CREATE TABLE definuje omezení NOT NULL pro sloupce [ID], [Jméno], [Příjmení], [Pohlaví] a [Adresa].
CREATE TABLE Employees ( ID INT NOT NULL, [FirstName] Varchar(100) NOT NULL, [MiddleName] Varchar(50) NULL, [LastName] Varchar(100) NOT NULL, [Gender] char(1) NOT NULL, [Address] Varchar(200) NOT NULL )
K ověření chování NOT NULL používáme následující příkazy INSERT.
- Vložit hodnoty pro všechny sloupce (NULL a NOT NULL) – Vložení úspěšně
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
- Vložte hodnoty pro sloupce s vlastností NOT NULL – Vloží úspěšně
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2, 'Shyam','Agarwal','M','UK')
- Přeskočit vkládání hodnot pro sloupec [LastName] s omezeními NOT NULL – Selhání+
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')
Poslední příkaz INSERT vyvolal chybu – Do sloupce nelze vložit hodnoty NULL .
Tato tabulka obsahuje následující hodnoty vložené do tabulky [Zaměstnanci].
Předpokládejme, že nevyžadujeme hodnoty NULL ve sloupci [MiddleName] podle požadavků HR. Pro tento účel můžete použít příkaz ALTER TABLE.
ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
Tento příkaz ALTER TABLE selže kvůli existujícím hodnotám sloupce [MiddleName]. Chcete-li vynutit omezení, musíte odstranit tyto hodnoty NULL a poté spustit příkaz ALTER.
UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL Go ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
Omezení NOT NULL můžete ověřit také pomocí návrháře tabulek SSMS.
JEDINEČNÉ omezení
Omezení UNIQUE v SQL Server zajišťuje, že nemáte duplicitní hodnoty v jednom sloupci nebo kombinaci sloupců. Tyto sloupce by měly být součástí omezení UNIQUE. SQL Server automaticky vytvoří index, když jsou definována UNIKÁTNÍ omezení. Ve sloupci můžete mít pouze jednu jedinečnou hodnotu (včetně NULL).
Vytvořte například [DemoTable] se sloupcem [ID] s omezením UNIQUE.
CREATE TABLE DemoTable ( [ID] INT UNIQUE NOT NULL, [EmpName] VARCHAR(50) NOT NULL )
Poté rozbalte tabulku v SSMS a získáte jedinečný index (Neklasifikován), jak je znázorněno níže.
Klikněte prosím pravým tlačítkem na index a vygenerujte jeho skript. Jak je ukázáno níže, používá pro omezení klíčové slovo ADD UNIQUE NONCLUSTERED.
Následující příkaz insert zobrazuje chybu, protože se pokouší vložit duplicitní hodnoty.
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj') GO INSERT INTO DemoTable ([ID],[EmpName]) VALUES (2,'Alisha') GO INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj') GO
ZKONTROLOVAT omezení
Omezení CHECK v SQL Server definuje platný rozsah hodnot, které lze vložit do zadaných sloupců. Vyhodnocuje každou vloženou nebo upravenou hodnotu, a pokud je splněna, SQL příkaz je úspěšně dokončen.
Následující skript SQL umístí omezení pro sloupec [Věk]. Jeho hodnota by měla být vyšší než 18 let.
CREATE TABLE DemoCheckConstraint ( ID INT PRIMARY KEY, [EmpName] VARCHAR(50) NULL, [Age] INT CHECK (Age>18) ) GO
Do této tabulky vložíme dva záznamy. Dotaz úspěšně vloží první záznam.
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20) Go INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17) GO
Druhý příkaz INSERT se nezdaří, protože nesplňuje omezující podmínku CHECK.
Dalším případem použití omezení CHECK je uložení platných hodnot PSČ. V níže uvedeném skriptu přidáme nový sloupec [ZipCode] a ten používá k ověření hodnot omezení CHECK.
ALTER TABLE DemoCheckConstraint ADD zipcode int GO ALTER TABLE DemoCheckConstraint ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))
Toto omezení CHECK nepovoluje neplatná PSČ. Například druhý příkaz INSERT generuje chybu.
INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203) Go INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)
Omezení PRIMÁRNÍHO KLÍČE
Omezení PRIMARY KEY v SQL Server je oblíbenou volbou mezi databázovými profesionály pro implementaci jedinečných hodnot v relační tabulce. Kombinuje omezení UNIQUE a NOT NULL. Jakmile definujeme omezení PRIMARY KEY, SQL Server automaticky vytvoří seskupený index. Pro definování jedinečných hodnot v řádku můžete použít jeden sloupec nebo sadu kombinací.
Jeho primárním účelem je vynutit integritu tabulky pomocí jedinečné hodnoty entity nebo sloupce.
Podobá se omezení UNIQUE s následujícími rozdíly.
PRIMÁRNÍ KLÍČ | JEDINEČNÝ KLÍČ |
Používá jedinečný identifikátor pro každý řádek v tabulce. | Unikátně definuje hodnoty ve sloupci tabulky. |
Do sloupce PRIMARY KEY nelze vložit hodnoty NULL. | Může přijmout jednu hodnotu NULL ve sloupci jedinečného klíče. |
Tabulka může mít pouze jedno omezení PRIMÁRNÍHO KLÍČE. | V SQL Serveru můžete vytvořit více omezení UNIQUE KEY. |
Ve výchozím nastavení vytváří seskupený index pro sloupce PRIMARY KEY. | JEDINÝ KLÍČ vytvoří neshlukovaný index pro sloupce primárního klíče. |
Následující skript definuje PRIMÁRNÍ KLÍČ ve sloupci ID.
CREATE TABLE PrimaryKeyDemo ( ID INT PRIMARY KEY, [Name] VARCHAR(100) NULL )
Jak je znázorněno níže, po definování PRIMARY KEY ve sloupci ID máte seskupený index klíče.
Vložme záznamy do tabulky [PrimaryKeyDemo] pomocí následujících příkazů INSERT.
INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj') GO INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan') GO
Ve druhém příkazu INSERT se zobrazí chyba, protože se pokouší vložit hodnotu NULL.
Podobně, pokud se pokusíte vložit duplicitní hodnoty, zobrazí se následující chybová zpráva.
Omezení ZAHRANIČNÍHO KLÍČE
Omezení FOREIGN KEY v SQL Server vytváří vztahy mezi dvěma tabulkami. Tento vztah je známý jako vztah rodič-dítě. Vynucuje referenční integritu v SQL Server.
Cizí klíč podřízené tabulky by měl mít odpovídající položku ve sloupci nadřazeného primárního klíče. Nemůžete vložit hodnoty do podřízené tabulky, aniž byste ji nejprve vložili do nadřazené tabulky. Podobně nejprve musíme odstranit hodnotu z podřízené tabulky, než ji bude možné vypustit z nadřazené tabulky.
Protože nemůžeme mít duplicitní hodnoty v podmínce PRIMARY KEY, neumožňuje duplicitní nebo NULL také v podřízené tabulce.
Následující skript SQL vytvoří nadřazenou tabulku s primárním klíčem a podřízenou tabulku s odkazem primárního a cizího klíče na sloupec nadřazené tabulky [EmpID].
CREATE TABLE ParentTable ( [EmpID] INT PRIMARY KEY, [Name] VARCHAR(50) NULL ) GO CREATE TABLE ChildTable ( [ID] INT PRIMARY KEY, [EmpID] INT FOREIGN KEY REFERENCES ParentTable(EmpID) )
Vložte záznamy do obou tabulek. Všimněte si, že hodnota cizího klíče podřízené tabulky má záznam v nadřazené tabulce.
INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal') INSERT INTO ChildTable VALUES (101,1),(102,2)
Pokud se pokusíte vložit záznam přímo do podřízené tabulky, který neodkazuje na primární klíč nadřazené tabulky, zobrazí se následující chybová zpráva.
VÝCHOZÍ omezení
Omezení DEFAULT v SQL Server poskytuje výchozí hodnotu pro sloupec. Pokud neurčíme hodnotu v příkazu INSERT pro sloupec s omezením DEFAULT, SQL Server použije svou výchozí přiřazenou hodnotu. Předpokládejme například, že tabulka objednávek obsahuje záznamy pro všechny objednávky zákazníků. K zachycení data objednávky můžete použít funkci GETDATE() bez zadání jakékoli explicitní hodnoty.
CREATE TABLE Orders ( [OrderID] INT PRIMARY KEY, [OrderDate] DATETIME NOT NULL DEFAULT GETDATE() ) GO
Pro vložení záznamů do této tabulky můžeme přeskočit přiřazení hodnot pro sloupec [Datum objednávky].
INSERT INTO Orders([OrderID]) values (1) GO
VYBERTE * Z objednávek
Jakmile sloupec DEFAULT omezení specifikuje explicitní hodnotu, SQL Server uloží tuto explicitní hodnotu namísto výchozí hodnoty.
Výhody omezení
Omezení v SQL Server mohou být přínosná v následujících případech:
- Prosazování obchodní logiky
- Prosazování referenční integrity
- Zabránění ukládání nesprávných dat v tabulkách SQL Server
- Vynucení jedinečnosti pro data sloupců
- Zlepšení výkonu dotazů, protože optimalizátor dotazů zná jedinečná data a ověřuje sady hodnot
- Zabránění ukládání hodnot NULL v tabulkách SQL
- Psaní kódů, aby se zabránilo NULL při zobrazování dat v aplikaci