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

всех соответствующих строк из таблицы o rd e r_ s ta tu s2 будет установлен в

NULL.

Перед тем, как перейти к следующему разделу, удалим столбец mod i f ied_

by:

□ ALTER TABLE o rd e r_ s ta tu s2

DROP COLUMN modified_by;

Добавление ограничения по уникальности

В следующем примере оператор ALTER TABLE используется для добавления

ограничения по уникальности (UNIQUE) к столбцу status таблицы order_

status2:

□ ALTER TABLE o rd e r_ s ta tu s2

ADD CONSTRAINT o rder_statu s2 _sta tu s_u q UNIQUE (s ta tu s ) ;

Все существующие или новые строки должны всегда иметь уникальное

значение в столбце status.

Удаление ограничения

Для удаления ограничения используется фраза DROP CONSTRAINT оператора

ALTER TABLE. Следующий пример удаляет ограничение o rder_statu s2 _

status_uq:

□ ALTER TABLE o rd e r_ s ta tu s2

DROP CONSTRAINT o rder_status2 _sta tu s_u q;

Блокирование ограничения

По умолчанию ограничение активируется непосредственно в момент его

создания. Можно при создании ограничения заблокировать его, добавив к

фразе CONSTRAINT ключевое слово DISABLE. В следующем примере к таблице

o rd e r_ s ta tu s2 добавляется ограничение, которое сразу же блокируется:

□ ALTER TABLE o rd e r_ s ta tu s2

ADD CONSTRAINT o rder_statu s2 _sta tu s_u q UNIQUE ( s ta tu s ) DISABLE;

Можно заблокировать активное ограничение, используя фразу DISABLE

CONSTRAINT оператора ALTER TABLE. Следующий пример блокирует ограничение

order_status2_status_nn:

□ ALTER TABLE o rd e r_ s ta tu s2

DISABLE CONSTRAINT o rder_status2_sta tu s_n n;

В конец фразы DISABLE CONSTRAINT можно добавить ключевое слово

CASCADE, чтобы заблокировать все ограничения целостности, зависящие от

указанного ограничения целостности. Фразу CASCADE необходимо использовать

при блокировке ограничения первичного ключа или ограничения

по уникальности, являющихся частью ограничения внешнего ключа.

Активация ограничения

Можно активировать существующее ограничение, используя фразу

ENABLING CONSTRAINT оператора ALTER TABLE. В следующем примере активизируется

ограничение o rder_status2_sta tu s_n n:

322 Глава 10

П ALTER TABLE order_status2

ENABLE CONSTRAINT order_status2_status_uq;

Чтобы можно было активировать ограничение, все строки таблицы

должны удовлетворять используемому в нем условию. Так, например, если

в таблице order_status2 есть строки, то для активации ограничения order_

status2_status_uq столбец status должен содержать только уникальные

значения.

Можно также выбрать вариант, когда ограничения применяются только

ко вновь вводимым данным, для чего достаточно указать ENABLE

NOVALIDATE:

□ ALTER TABLE order_status2

ENABLE NOVALIDATE CONSTRAINT order_status2_status_uq;

Примечание Значением по умолчанию является ENABLE VALIDATE. Это означает, что существующие

строки должны пройти проверку ограничением.

Отложенные ограничения

Отложенным ограничением (deferred constraint) называется ограничение,

вступающее в силу только после фиксации транзакции. Ограничение

определяется как отложенное путем использования фразы DEFERRABLE при

первоначальном добавлении ограничения. Если ограничение уже было

добавлено, нельзя изменить его и добавить режим DEFERRABLE: необходимо

удалить ограничение и заново создать его.

При создании отложенного ограничения, указывая для него режим

DEFERRABLE, можно отметить это ограничение как INITIALLY IMMEDIATE или

как INITIALLY DEFERRED. Ключевые слова INITIALLY IMMEDIATE означают, что

ограничение будет проверяться всякий раз при добавлении, обновлении

или удалении строки из таблицы (именно так по умолчанию ведет себя

ограничение). Ключевые слова INITIALLY DEFERRED означают, что проверка

выполнения ограничения будет производиться только после завершения

и фиксации транзакции. Давайте посмотрим на пример.

Следующее выражение удаляет ограничение order_status2_status_uq:

□ ALTER TABLE order_status2

DROP CONSTRAINT order_status2_status_uq;

В следующем примере добавляется ограничение order_status2_status_

uq и устанавливается на DEFERRABLE INITIALLY DEFERRED:

□ ALTER TABLE order_status2

ADD CONSTRAINT order_status2_status_uq UNIQUE (status)

DEFERRABLE INITIALLY DEFERRED;

Теперь при добавлении строк в таблицу order_status2 выполнение

ограничения order_status2_status_uq не будет проверяться, пока не зафиксированы

результаты выполнения транзакции.

Создание таблиц, последовательностей, индексов и представлений 323

Получение информации об ограничениях

Получить информацию о созданных ограничениях можно, задав запрос к

представлению user_constraints. В таблице 10.4 перечислены некоторые

столбцы в user_constraints.

Примечание Для получения информации о всех ограничениях следует сделать запрос к all_

constraints.

Таблица 10.4. Некоторые столбцы в user_constraints