Проверочные ограничения

Проверочные ограничения

Проверочное  ограничение имеет вид:

CHECK (<предикат>)

Предикат может принимать значения TRUE, FALSE или UNKNOWN. Предикат считается нарушенным, когда он принимает значение FALSE; при этом действие, которое привело к нарушению предиката, не выполняется, и генерируется сообщение об ошибке.

Вернемся к нашей проблеме, а именно вставке строки (NULL,    ‘2000’,    NULL) в таблицу Product. Понятно, что подобных строк следует избегать, т.к. неизвестно, чем является модель 2000 и каким производителем она выпускается.  Мы можем использовать предикат IS NOT NULL в проверочных ограничениях для столбцов maker и type:

DROP TABLE Product;
create table Product (
maker varchar(10),
model varchar(50),
type varchar(50),
CONSTRAINT product_PK PRIMARY KEY (model),
CONSTRAINT maker_ch CHECK(maker IS NOT NULL),
CONSTRAINT type_ch CHECK(type IS NOT NULL)
);

Теперь при попытке вставить строку (NULL,    ‘2000’,    NULL) мы получим сообщение об ошибке:

Cannot insert the value NULL into column 'model', table 'Product'; column does not allow nulls. INSERT fails.
(Значение NULL не может быть вставлено в столбец model таблицы Product; столбец не допускает NULL-значений. INSERT не выполнен)

И строка вставлена не будет, вернее, будет отклонен весь оператор INSERT.

Заметим, что ограничение NOT NULL (как и PRIMARY KEY для простого ключа) может быть записано непосредственно в определение столбца:

DROP TABLE Product;
create table Product (
maker varchar(10) NOT NULL,
model varchar(50) PRIMARY KEY,
type varchar(50) NOT NULL
);

Более того, любое ограничение уровня столбца можно записать непосредственно в определении столбца.
Ниже приводится пример, добавляющий новый столбец (available) в таблицу Product:

ALTER TABLE Product ADD available VARCHAR(20) DEFAULT 'Yes';

Чтобы ограничить допустимые значения в данном столбце значениями ‘Yes’ и ‘No’, этот оператор можно было бы переписать в виде:

ALTER TABLE Product ADD available VARCHAR(20)
CHECK(available in('Yes','No')) DEFAULT 'Yes';