Проверочные ограничения
Проверочное ограничение имеет вид:
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) мы получим сообщение об ошибке:
И строка вставлена не будет, вернее, будет отклонен весь оператор 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';