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

Добавете ограничение CHECK към съществуваща таблица в SQL Server (T-SQL)

Тази статия демонстрира как да добавите 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 , или изображение колони.

  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. Какво е доверена връзка?

  3. CEILING() Примери в SQL Server

  4. Как да добавите номера на редове в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 11

  5. SQL Server:Прикачете неправилна версия 661