INITIALLY DEFERRED | Откладывает проверку ограничения до окончания транзакции |
INITIALLY IMMEDIATE | Проверяет ограничение в конце выполнения инструкции |
Ограничение, которое определяется как допускающее задержку, может задаваться как INITIALLY DEFERRED
или как INITIALLY IMMEDIATE
. По умолчанию используется предложение INITIALLY IMMEDIATE
.
В примере на рисунке:
-
Ограничение
sal_ck
создается какDEFERRABLE INITIALLY IMMEDIATE
. -
Ограничение
bonus_ck
создается какDEFERRABLE INITIALLY DEFERRED
.
Как показано на рисунке, после создания таблицы emp_new_sal
предпринимается попытка вставить значения в таблицу и просмотреть результаты. Когда оба ограничения sal_ck
и bonus_ck
выполнены, строки вставляются без ошибки.
Пример 1. Вставьте строку, которая нарушает ограничение sal_ck
. В инструкции CREATE TABLE
ограничение sal_ck
задается как первоначально немедленное. Это означает, что сразу после инструкции INSERT
проверяется ограничение и выводится сообщение об ошибке.
INSERT INTO emp_new_sal VALUES (90,5); |
Пример 2. Вставьте строку, которая нарушает ограничение bonus_ck
. В инструкции CREATE TABLE
ограничение bonus_ck
задается как допускающее задержку, а также как первоначально отложенное. Поэтому ограничение не проверяется до тех пор, пока не будет выполнена операция COMMIT
или пока ограничение не будет снова установлено как немедленное.
INSERT INTO emp_new_sal VALUES (110, -1); |
Строка вставлена успешно. Однако при фиксации транзакции отображается ошибка.
Фиксация транзакции завершилась ошибкой из-за нарушения ограничения. Поэтому на данном этапе транзакция откатывается базой данных назад.
Пример 3. Установите статус DEFERRED
для всех ограничений, которые могут быть отложены. Обратите внимание, что при необходимости можно также установить статус DEFERRED
для одиночного ограничения.
|
Теперь, если попытаться вставить строку, которая нарушает ограничение sal_ck, инструкция выполняется успешно.
|
Однако при фиксации транзакции отображается ошибка. Транзакция завершается ошибкой и откатывается назад. Это обусловлено тем, что оба ограничения проверяются при выполнении операции COMMIT
.
Пример 4. Установите статус IMMEDIATE
для обоих ограничений, которые были заданы в предыдущем примере как DEFERRED
.
|
При попытке вставить строку, которая нарушает любое из ограничений sal_ck или bonus_ck, отображается ошибка.
|
Примечание. Если таблица создается без указания задержки ограничения, тогда ограничение проверяется сразу в конце каждой инструкции. Например, если для инструкции CREATE TABLE
таблицы newemp_details
не задать возможность задержки ограничения newemp_det_pk
, тогда ограничение проверяется незамедлительно.
CREATE TABLE newemp_details(emp_id NUMBER, emp_name VARCHAR2(20),
|
При попытке отложить ограничение newemp_det_pk
, которое не допускает задержку, отображается следующая ошибка:
|
Далее: Сведения об ограничениях