Выбрать главу

во фразе 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 для