| 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, которое не допускает задержку, отображается следующая ошибка:
|
|

Далее: Сведения об ограничениях