Тази статия демонстрира как да добавите CHECK
ограничение към съществуваща таблица.
Можете да добавите ограничение към съществуваща таблица, като използвате ALTER TABLE
израз заедно с ADD CONSTRAINT
аргумент. Примери по-долу.
Пример 1 – Създайте таблицата
Първо, нека създадем таблица, за която ще добавим CHECK
ограничение.
CREATE TABLE Event ( EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY, EventName varchar(255) NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, Price smallmoney NOT NULL );
Пример 2 – Добавете ограничение на ниво колона
Сега нека добавим CHECK
ограничение за
Цена
колона.
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Това ограничение ще гарантира, че цената винаги е по-голяма от нула.
След като ограничението е добавено, ето какво се случва, ако се опитаме да вмъкнем невалидни данни:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
Резултат:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.
В този случай CHECK
ограничението указва, че всички данни в Price
колоната трябва да е по-голяма от 0. С други думи, цената не може да бъде нула и не може да бъде отрицателна.
Това се нарича ограничение на ниво колона , тъй като е дефиниран в една колона. Прилага се за данни в една колона.
Пример 3 – Добавете ограничение на ниво таблица
Сега нека добавим CHECK
на ниво таблица ограничение. Това ще провери данните в две колони.
ALTER TABLE Event ADD CONSTRAINT chkEndDate CHECK (EndDate >= StartDate);
В този случай добавям ограничение, за да гарантирам, че крайната дата никога не може да бъде по-рано от началната. Това е проверка на данни в две колони и следователно е ограничение на ниво таблица.
Опитайте да въведете невалидна стойност:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
Резултат:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".
Както се очакваше, операцията е неуспешна, защото моята крайна дата е по-ранна от началната.
Имайте предвид, че за да тествам това ограничение, трябваше да увелича цената до валидна стойност, за да предотвратя първото задействане на предишното ограничение (CHECK
ограниченията се валидират в реда, в който са създадени).
Пример 4 – Успешно вмъкване на данни, които отговарят на ограничението
За да вмъкнем успешно ред, всичко, което трябва да направим, е да се уверим, че вмъкваме валидни стойности.
Пример:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
Резултат:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
Имайте предвид, че
EventId
колоната вече се е увеличила до 4. Това е така, защото е IDENTITY
колона. Важно нещо, което трябва да запомните за IDENTITY
колони е, че те се увеличават дори когато ограничение причинява INSERT
операция е неуспешна.
Някои ограничения на ограниченията на CHECK
Ето няколко ограничения, които трябва да имате предвид, когато работите с CHECK
ограничения:
- Условието за търсене трябва да се изчисли до булев израз и не може да препраща към друга таблица.
- Изразът не може да съдържа типове данни за псевдоним.
CHECK
ограниченията не могат да бъдат дефинирани за текст , ntext , или изображение колони.