Ограниченията в SQL Server са предварително дефинирани правила, които можете да наложите върху една или няколко колони. Тези ограничения помагат за поддържане на целостта, надеждността и точността на стойностите, съхранявани в тези колони. Можете да създавате ограничения с помощта на изрази CREATE TABLE или ALTER Table. Ако използвате израза ALTER TABLE, SQL Server ще провери съществуващите данни в колоната, преди да създаде ограничението.
Ако вмъкнете данни в колоната, която отговаря на критериите на правилото за ограничения, SQL Server вмъква данни успешно. Ако обаче данните нарушават ограничението, операторът за вмъкване се прекратява със съобщение за грешка.
Помислете например, че имате таблица [Служител], която съхранява данните за служителите на вашата организация, включително тяхната заплата. Има няколко основни правила, когато става въпрос за стойности в колоната за заплати.
- Колоната не може да има отрицателни стойности като -10 000 или -15 000 USD.
- Искате също да посочите максималната стойност на заплатата. Например, максималната заплата трябва да бъде по-малка от 2 000 000 USD.
Ако вмъкнете нов запис с въведено ограничение, SQL Server ще потвърди стойността спрямо дефинираните правила.
Вмъкната стойност:
Заплата 80 000:Вмъкнато успешно
Заплата -50 000: Грешка
В тази статия ще разгледаме следните ограничения в SQL Server.
- НЕ НУЛВО
- УНИКАЛНО
- ПРОВЕРКА
- ПЪРВИЧЕН КЛЮЧ
- ВЪНШЕН КЛЮЧ
- ПО ПОДРАЗБИРАНЕ
Ограничение НЕ NULL
По подразбиране SQL Server позволява съхраняване на NULL стойности в колони. Тези NULL стойности не представляват валидни данни.
Например всеки служител в организация трябва да има Emp ID, собствено име, пол и адрес. Следователно можете да посочите колона с ограничения NOT NULL, за да гарантирате винаги валидни стойности.
Скриптът CREATE TABLE по-долу дефинира NOT NULL ограничения за колоните [ID], [FirstName], [LastName], [Gender] и [Address].
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 )
За да потвърдим поведението на ограниченията NOT NULL, ние използваме следните оператори INSERT.
- Вмъкване на стойности за всички колони (NULL и NOT NULL) – Вмъква се успешно
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
- Вмъкване на стойности за колони със свойство NOT NULL – Вмъква се успешно
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2, 'Shyam','Agarwal','M','UK')
- Пропуснете вмъкването на стойности за колона [LastName] с ограничения NOT NULL – Fails+
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')
Последният израз INSERT повдигна грешката – Не може да се вмъкнат NULL стойности в колоната .
Тази таблица има следните стойности, вмъкнати в таблицата [Служители].
Да предположим, че не изискваме стойности NULL в колоната [MiddleName] според изискванията за човешки ресурси. За тази цел можете да използвате израза ALTER TABLE.
ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
Този оператор ALTER TABLE е неуспешен поради съществуващите стойности на колоната [MiddleName]. За да приложите ограничението, трябва да премахнете тези NULL стойности и след това да изпълните оператора ALTER.
UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL Go ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
Можете също да потвърдите ограниченията NOT NULL с помощта на дизайнера на SSMS таблици.
УНИКАЛНО ограничение
Ограничението UNIQUE в SQL Server гарантира, че нямате дублирани стойности в една колона или комбинация от колони. Тези колони трябва да са част от ограниченията UNIQUE. SQL Server автоматично създава индекс когато са дефинирани УНИКАЛНИ ограничения. Можете да имате само една уникална стойност в колоната (включително NULL).
Например, създайте [DemoTable] с колона [ID] с ограничение UNIQUE.
CREATE TABLE DemoTable ( [ID] INT UNIQUE NOT NULL, [EmpName] VARCHAR(50) NOT NULL )
След това разгънете таблицата в SSMS и ще имате уникален индекс (неклъстериран), както е показано по-долу.
Моля, щракнете с десния бутон върху индекса и генерирайте неговия скрипт. Както е показано по-долу, той използва ключова дума ADD UNIQUE NONCLUSTERED за ограничението.
Следният оператор за вмъкване дава грешка, защото се опитва да вмъкне дублиращи се стойности.
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
Проверете ограничение
Ограничението CHECK в SQL Server дефинира валиден диапазон от стойности, които могат да бъдат вмъкнати в определени колони. Той оценява всяка вмъкната или променена стойност и ако е удовлетворена, SQL операторът е завършен успешно.
Следният SQL скрипт поставя ограничение за колоната [Възраст]. Стойността му трябва да е по-голяма от 18 години.
CREATE TABLE DemoCheckConstraint ( ID INT PRIMARY KEY, [EmpName] VARCHAR(50) NULL, [Age] INT CHECK (Age>18) ) GO
Нека вмъкнем два записа в тази таблица. Заявката вмъква първия запис успешно.
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20) Go INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17) GO
Вторият оператор INSERT е неуспешен, защото не отговаря на условието за ограничение CHECK.
Друг случай на използване на ограничението CHECK е съхраняването на валидни стойности на пощенските кодове. В долния скрипт добавяме нова колона [ZipCode] и тя използва ограничението CHECK, за да потвърди стойностите.
ALTER TABLE DemoCheckConstraint ADD zipcode int GO ALTER TABLE DemoCheckConstraint ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))
Това ограничение CHECK не позволява невалидни пощенски кодове. Например вторият израз INSERT генерира грешка.
INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203) Go INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)
Ограничение ПЪРВЕН КЛЮЧ
Ограничението PRIMARY KEY в SQL Server е популярен избор сред специалистите по бази данни за внедряване на уникални стойности в релационна таблица. Той съчетава ограничения UNIQUE и NOT NULL. SQL Server автоматично създава клъстериран индекс след като дефинираме ограничение PRIMARY KEY. Можете да използвате една колона или набор от комбинации за дефиниране на уникални стойности в ред.
Основната му цел е да наложи целостта на таблицата с помощта на уникалната стойност на обект или колона.
То е подобно на ограничението UNIQUE със следните разлики.
ПЪРВИЧЕН КЛЮЧ | УНИКАЛЕН КЛЮЧ |
Той използва уникален идентификатор за всеки ред в таблица. | Той уникално дефинира стойности в колона на таблицата. |
Не можете да вмъквате NULL стойности в колоната ОСНОВЕН КЛЮЧ. | Може да приеме една стойност NULL в колоната с уникален ключ. |
Една таблица може да има само едно ограничение ПЪРВЕН КЛЮЧ. | Можете да създадете множество ограничения UNIQUE KEY в SQL Server. |
По подразбиране той създава клъстериран индекс за колоните ОСНОВНИ КЛЮЧ. | УНИКАЛНИЯТ КЛЮЧ създава неклъстериран индекс за колоните с първичен ключ. |
Следният скрипт дефинира ПЪРВИЧНИЯ КЛЮЧ в колоната ID.
CREATE TABLE PrimaryKeyDemo ( ID INT PRIMARY KEY, [Name] VARCHAR(100) NULL )
Както е показано по-долу, имате клъстериран ключов индекс след дефиниране на ПЪРВИЧНИЯ КЛЮЧ в колоната ID.
Нека вмъкнем записите в таблицата [PrimaryKeyDemo] със следните оператори INSERT.
INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj') GO INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan') GO
Получавате грешка във втория израз INSERT, защото се опитва да вмъкне стойността NULL.
По същия начин, ако се опитате да вмъкнете дублиращи се стойности, получавате следното съобщение за грешка.
Ограничение за ВЪНШЕН КЛЮЧ
Ограничението FOREIGN KEY в SQL Server създава връзки между две таблици. Тази връзка е известна като връзката родител-дете. Той налага референтната цялост в SQL Server.
Външният ключ на дъщерната таблица трябва да има съответен запис в колоната на родителския първичен ключ. Не можете да вмъкнете стойности в дъщерната таблица, без първо да я вмъкнете в родителската таблица. По същия начин, първо, трябва да премахнем стойността от дъщерната таблица, преди да може да бъде изхвърлена от родителската таблица.
Тъй като не можем да имаме дублиращи се стойности в ограничението PRIMARY KEY, то също не позволява дублиране или NULL в дъщерната таблица.
Следният SQL скрипт създава родителска таблица с първичен ключ и дъщерна таблица с препратка към първичен и външен ключ към колоната на родителската таблица [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) )
Вмъкнете записи в двете таблици. Обърнете внимание, че стойността на външния ключ на дъщерната таблица има запис в родителската таблица.
INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal') INSERT INTO ChildTable VALUES (101,1),(102,2)
Ако се опитате да вмъкнете запис директно в дъщерната таблица, който не препраща към първичния ключ на родителската таблица, получавате следното съобщение за грешка.
Ограничение ПО ПОДРАЗБИРАНЕ
Ограничението DEFAULT в SQL Server предоставя стойността по подразбиране за колона. Ако не посочим стойност в оператора INSERT за колоната с ограничението DEFAULT, SQL Server използва присвоената по подразбиране стойност. Например, да предположим, че таблица с поръчки има записи за всички поръчки на клиенти. Можете да използвате функцията GETDATE(), за да уловите датата на поръчката, без да посочвате изрична стойност.
CREATE TABLE Orders ( [OrderID] INT PRIMARY KEY, [OrderDate] DATETIME NOT NULL DEFAULT GETDATE() ) GO
За да вмъкнем записите в тази таблица, можем да пропуснем присвояването на стойности за колоната [OrderDate].
INSERT INTO Orders([OrderID]) values (1) GO
ИЗБЕРЕТЕ * ОТ Поръчки
След като колоната с ограничение DEFAULT посочва изрична стойност, SQL Server съхранява тази изрична стойност вместо стойността по подразбиране.
Предимства от ограничения
Ограниченията в SQL Server могат да бъдат полезни в следните случаи:
- Прилагане на бизнес логиката
- Налагане на референтната цялост
- Предотвратяване на съхраняването на неправилни данни в таблици на SQL Server
- Налагане на уникалност за данните в колоните
- Подобряване на производителността на заявките, тъй като оптимизаторът на заявки е наясно с уникалните данни и валидира набори от стойности
- Предотвратяване на съхраняването на NULL стойности в SQL таблици
- Писане на кодове за избягване на NULL, докато се показват данни в приложението