во фразе IN. В выполняемом ниже операторе INSERT добавляется строка,
в которой значение столбца status равно PENDING:
П INSERT INTO order_status2 (
id, status, lastjnodified, modified_by
) VALUES (
1, ‘ PENDING’ , ‘ 01-JAN-2005’ , 1
);
Создание таблиц, последовательностей, индексов и представлений 319
При попытке добавить строку, не удовлетворяющую контрольному
ограничению, база данных выдаст сообщение об ошибке ORA-02290. Следующий
оператор INSERT пытается добавить строку, для которой значение
столбца status не попадает в список разрешенных значений:
□ INSERT INTO o rd e r_ s ta tu s2 (
id , s ta tu s , la s t jn o d if ie d , modified_by
) VALUES (
2, ‘ CLEARED’ , ‘ 01-JAN-2005’ , 2
);
INSERT INTO o rd e r_ s ta tu s2 (
*
ERROR at lin e 1:
0RA-02290: check c o n s t ra in t (STORE.0RDER_STATUS2_STATUS_CK) v io la te d
(0RA-02290: нарушено контрольное ограничение (STORE.0RDER_STATUS2_STATUS_
CK))
Поскольку ограничение CHECK нарушено, база данных отвергает новую
строку.
В ограничении CHECK можно использовать и другие операторы сравнения.
В следующем примере добавляется контрольное определение, которое
обеспечивает принудительное выполнение условия: значение id больше
нуля:
D ALTER TABLE o rd e r_ s ta tu s2
ADD CONSTRAINT o rd e r_ s ta tu s2 _ id _ c k CHECK ( id > 0);
Чтобы добавить ограничение, все имеющиеся к этому моменту строки
таблицы должны удовлетворять этому ограничению. Например, если в
таблице order_status2 есть строки, добавить ограничение order_status2_
id_ck на столбец id можно будет только в том случае, если все значения
столбца id будут больше нуля.
Примечание Из предыдущего правила есть исключение: добавляя ограничение, его можно
заблокировать и выбрать вариант, когда ограничение будет применяться только к новым данным,
если указать ключевые слова ENABLE N0VALIDATE (см. ниже в данной главе).
Добавление ограничения N O T N U L L
В следующем примере оператор ALTER TABLE используется для добавления
ограничения NOT NULL к столбцу status таблицы order_status2:
□ ALTER TABLE o rd e r_ s ta tu s2
MODIFY s ta tu s CONSTRAINT o rder_statu s2 _statu s_n n NOT NULL;
Для добавления ограничения NOT NULL используется ключевое слово
MODIFY, а не ADD CONSTRAINT. В следующем примере ограничение NOT NULL
добавляется к столбцу modified_by:
□ ALTER TABLE o rd e r_ s ta tu s2
MODIFY modified_by CONSTRAINT order_status2_modified_by_nn NOT NULL;
Еще одно ограничение NOT NULL добавляется к столбцу la s t_m o d ifie d
320 Глава 10
□ ALTER TABLE o rd e r_ s ta tu s2
MODIFY la s t jn o d if ie d NOT NULL;
В последнем примере не указано имя ограничения. В этом случае база
данных автоматически назначает ограничению недружественное имя, например
SYS_C003381.
Совет Всегда назначайте ограничениям осмысленные имена. Это нужно для того, чтобы,
если во время выполнения приложения произойдет ошибка, связанная с нарушением ограничений,
вы могли легко идентифицировать проблему.
Добавление ограничения внешнего ключа
Перед тем, как вы увидите пример добавления ограничения FOREIGN KEY,
следующее выражение ALTER TABLE исключит столбец modified_by из таблицы
order_status2 :
□ ALTER TABLE o rd e r_ s ta tu s2
DROP COLUMN modified_by;
Следующее выражение добавляет ограничение внешнего ключа, которое
ссылается на столбец employees.employee_id:
□ ALTER TABLE o rd e r_ s ta tu s2
ADD CONSTRAINT ord e r_sta tu s2 _m od ified _ b y_fk
modified_by REFERENCES employees(employee_id);
Фраза ON DELETE CASCADE используется вместе с ограничением внешнего
ключа, чтобы указать, что, если из родительской таблицы удаляется
строка, все соответствующие ей строки из дочерних таблиц также должны
быть удалены. В следующем примере удаляется столбец modif ied_by, а предыдущий
пример переписывается так, чтобы в нем появилась фраза ON
DELETE CASCADE:
□ ALTER TABLE o rd e r_ s ta tu s2
DROP COLUMN modified_by;
ALTER TABLE o rd e r_ s ta tu s2
ADD CONSTRAINT ord e r_sta tu s2 _m od ified _ b y_fk
modified_by REFERENCES employees(employee_id) ON DELETE CASCADE;
При удалении строки из таблицы employees будут также удалены все соответствующие
ей строки из таблицы order_status2 .
Фраза ON DELETE SET NULL используется вместе с ограничением внешнего
ключа, чтобы указать, что если из родительской таблицы удаляется
строка, то столбец внешнего ключа для строки (или строк) из дочерних
таблиц устанавливается в NULL. В следующем примере из таблицы order_
status2 удаляется столбец modified Jby, а предыдущий пример переписывается
так, чтобы в нем появилась фраза ON DELETE SET NULL:
□ ALTER TABLE o rd e r_ s ta tu s2
DROP COLUMN modified_by;
ALTER TABLE o rd e r_ s ta tu s2
ADD CONSTRAINT o rd er_statu s2 _m o d ified_ by_fk
modified_by REFERENCES employees(employee_id) ON DELETE SET NULL;
Создание таблиц, последовательностей, индексов и представлений 321
При удалении строки из таблицы employees столбец modified_by для