Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

ПРОВЕРЯТЕ Ограниченията в SQL Server

В тази статия ще говорим за ограниченията на CHECK. Ще видим как да добавим CHECK ограничения към колоните на таблицата на SQL Server и ще обсъдим подводните камъни, които може да срещнете, когато използвате този тип ограничения на SQL Server.

ПРОВЕРЕТЕ основните положения на ограниченията

Ограниченията CHECK са просто условни изрази (предикати, които връщат TRUE или FALSE), които се отнасят до колоните на таблицата за поддържане на целостта на данните. Когато човек вмъкне данни в колона или няколко колони в един ред, влизат в действие ограниченията CHECK. Те оценяват данните, които трябва да бъдат въведени. В случай, че данните не отговарят на условието, посочено в ограничението CHECK, вмъкването е неуспешно.

Разгледайте следния пример:

Изисква се да зададете ограничение за колоната Заплата, така че да съхранява само положителни стойности, които не надвишават $150 000. Условното изявление ще изглежда по следния начин:(Заплата>=0 и Заплата <=150 000). Докато се опитвате да вмъкнете отрицателни стойности, предикатът ще доведе до FALSE и вмъкването ще бъде неуспешно.

Възможно е да добавите ограничение CHECK към една или няколко колони. Добавянето на ограничение CHECK за няколко колони може да се приложи на ниво таблица.

Работа с ограничения CHECK

Как да създадете ограничения за ПРОВЕРКА в SSMS

  1. В Object Explorer , отидете до необходимата таблица.

  2. Щракнете с десния бутон върху Ограничения папка и след това c щракнете върху Ново ограничение...

  3. В десния панел на Проверка на ограниченията диалогов прозорец, щракнете върху Изразяване и след това щракнете върху бутона с многоточие.

  1. Въведете израз на ограничение CHECK в текстовото поле на Проверка на израза за ограничение диалогов прозорец. Например, за да разрешите само седемцифрени пощенски кодове в Zip колона, изразът може да изглежда по следния начин:

В Дизайнер на таблици раздел, можете да настроите правилата за прилагане на ограничението.

ПРОВЕРАЙТЕ Ограничение за CREATE TABLE

Разгледайте следния пример:

Изисква се да се създаде таблица, която съхранява данни за клиенти на банката и да се попълни с тестови данни. Таблицата ще включва следните колони:идентификатор на клиента, име, фамилия, статус, телефон, град, щат и пощенски код.

При разработването на таблицата трябва да вземем предвид следните факти:

  1. Основният ZIP формат се състои от пет цифрови цифри.

  2. Стандартният американски телефонен номер е десет цифри, като (555) 555-1234

  3. Двубуквените съкращения се използват за представяне на политическите подразделения на Съединените щати за пощенски адреси, обработка на данни, общи съкращения и други цели.

Задачата е да осигури последователност на данните за таблицата. Изисква се да се забрани вмъкването на 12-цифрени телефонни номера и 6-цифрени ципове и т.н. За да направим това, SQL Server ни позволява да добавим едно или повече ограничения CHECK за всяка колона на таблицата.

В предишния раздел разгледахме единствения начин за създаване на ограничение CHECK в SSMS. Сега ще обсъдим как да създадем ограничението с помощта на T-SQL.

Следният скрипт показва как да създадете ограничение CHECK в колоната Zip:

CREATE TABLE Customers
(
 Customer_Id tinyint NOT NULL,
 [First Name] varchar(50),
 [Last Name] varchar(50),
 Status varchar(50),
 Phone tinyint,
 Address varchar(50),
 State varchar(50),
 Zip tinyint,
 Email varchar(50),
 [Credit Limit] INT NULL,
 CONSTRAINT CK_Zip CHECK (Zip LIKE REPLICATE ('[0-9]', 5)) --Check Constraint Condition
)

Сега нека видим какво получаваме, когато се опитваме да вмъкнем 6-цифрена стойност в колоната Zip:

INSERT INTO dbo.Customers (Customer_Id, [First Name], [Last Name], Status, Phone, Address, State, Zip, Email)
SELECT 1, 'James', 'Madison', 'Mr', 555-555-1234, 'Madison street, 12', 'LA', 123456, NULL
GO

Вмъкването е неуспешно и SQL Server показва следната превенция:

Дотук всичко е добре.

Израз CASE в ограничението CHECK

Да приемем, че банката има бизнес правило за определяне на кредитния лимит за жителите на щата Луизиана да бъде под $150 000. Ще приложим това изискване, като добавим ограничение CHECK към колоната Кредитен лимит:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (State='LA' AND [Credit Limit] <= 150000)
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (1, 'James Black', 'Mr', 5558787, 'LA', 46853, '[email protected]', 120000);
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (2, 'Mark Spencer', 'Mr', 3332244, 'NY', 23487, '[email protected]', 200000);
GO

Докато изпълняваме горния оператор, получаваме следната грешка:

Изявлението INSERT е в конфликт с ограничението CHECK. Какво се обърка?

Нека разгледаме по-отблизо заявката. Обърнете внимание, че ограничението CHECK позволява само стойностите на „LA“ за колоната State. В същото време стойностите в колоната Кредит не трябва да надвишават 150 000.

По същия начин, ограничението CHECK не би позволило записване на други кодове на състоянието в колоната.

По този начин трябва да променим условието. Според бизнес логиката банката предоставя $150 000 от кредитния лимит за жителите на Луизиана. В същото време тази стойност може да варира за други жители.

За да приложим този случай, ще използваме клаузата CASE в ограничението CHECK:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (CASE WHEN State='LA' AND [Credit Limit] <= 150000 THEN 1 ELSE 0 END = 1)
GO

Този израз напълно отговаря на бизнес логиката.

NULL стойности в ограничението CHECK

Банката разделя своите клиенти на сегменти. Колоната Статус съдържа данните, които определят дали клиентът е VIP или обикновен. Максималният размер на кредитния лимит за редовни клиенти е $200 000. VIP-персоните могат да изтеглят $500,000.

Ограничението CHECK може да изглежда по следния начин:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Status_Credit_Limit
CHECK (Status = 'VIP' OR Status = 'Regular')
GO

Обърнете внимание, че ограничението CHECK позволява вмъкване на NULL в колоната State (при условие, че няма изрично дефинирано ограничение NOT NULL). Ограничението CHECK оценява стойностите и връща TRUE или FALSE. Той оценява NULL като НЕИЗВЕСТНО. Следователно NULL няма да доведат до грешки. Това е в противоречие с предикатите в клаузите WHERE в изразите SELECT или UPDATE.

ПРАВКА и НЕПРЕКРАНЕ

От време на време бизнес логиката се променя. Това причинява модификации на обекта на базата данни. Представете си, че държава разширява базата на пощенския код и добавя 6-цифрени стойности.

Старите 5-цифрени стойности вече няма да се присвояват на областите. Те обаче все още са валидни за съществуващите. По този начин ограничението CHECK трябва да вземе предвид съществуващите данни в стария формат и да потвърди данните в новия формат.

Клаузата NOCHECK разрешава този проблем:

ALTER TABLE Customers WITH NOCHECK
ADD CONSTRAINT CK_Zip_Code
CHECK (Zip LIKE REPLICATE('[0-9]', 6));
GO

Следното вмъкване е успешно:

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (102, 'Jake Harrison', 'VIP', 555-555-1234, 'NY', 123456, '[email protected]', 100000);
GO

Когато се опитвате да вмъкнете петцифрен цип, двигателят извежда грешката:

КОНТРОЛНИ ОГРАНИЧЕНИЯ DBCC

SQL Server предоставя DBCC CHECKCONSTRAINTS за търсене на данни, които не съответстват на ограниченията.

Ако има проблем с целостта на базата данни, изпълнете DBCC CHECKCONSTRAINTS за цялата база данни, за да се уверите, че няма проблеми.

Обърнете внимание, че тази команда влияе върху производителността. Следователно не трябва да се изпълнява по график.

Възможно е да се изпълняват DBCC CHECKCONSTRAINTS за едно ограничение, таблица или цялата база данни.

В сравнение с други команди за проверка, DBCC CHECKCONSTRAINTS отнема значително време за завършване и консумира системни ресурси. За разлика от други команди, CHECKCONSTRAINTS не използва моментна снимка на базата данни.

Заключение

Ограниченията CHECK предоставят механизма за оценка на данните преди вмъкване. CHECK ограниченията могат да се отнасят до една колона или няколко колони на таблицата.

Ограниченията са просто предикати, които водят до TRUE, FALSE или UNKNOWN. В случай, че NULL е вмъкнато в таблица, ограничение не се нарушава.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Размито съвпадение с помощта на T-SQL

  2. DBA - Как да убиете всички процеси на база данни на SQL Server

  3. Заявката изтече от уеб приложението, но работи добре от студиото за управление

  4. Android достъп до отдалечена SQL база данни

  5. Тип текст на SQL Server спрямо тип данни varchar