Разница между параметрами INITIALLY DEFERRED и INITIALLY IMMEDIATE

INITIALLY DEFERRED Откладывает проверку ограничения до окончания транзакции
INITIALLY IMMEDIATE Проверяет ограничение в конце выполнения инструкции

2-16-1877912

Ограничение, которое определяется как допускающее задержку, может задаваться как 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-16-2-8215391

Пример 2. Вставьте строку, которая нарушает ограничение bonus_ck. В инструкции CREATE TABLE ограничение bonus_ck задается как допускающее задержку, а также как первоначально отложенное. Поэтому ограничение не проверяется до тех пор, пока не будет выполнена операция COMMIT или пока ограничение не будет снова установлено как немедленное.

     INSERT INTO emp_new_sal VALUES(110, -1);

2-16-3-5392974

Строка вставлена успешно. Однако при фиксации транзакции отображается ошибка.

2-16-4-6559567

Фиксация транзакции завершилась ошибкой из-за нарушения ограничения. Поэтому на данном этапе транзакция откатывается базой данных назад.

Пример 3. Установите статус DEFERRED для всех ограничений, которые могут быть отложены. Обратите внимание, что при необходимости можно также установить статус DEFERRED для одиночного ограничения.

    

SET CONSTRAINTS ALL DEFERRED;

2-16-5-3117419

Теперь, если попытаться вставить строку, которая нарушает ограничение sal_ck, инструкция выполняется успешно.

    

INSERT INTO emp_new_sal VALUES(90,5);

2-16-6-2350761

Однако при фиксации транзакции отображается ошибка. Транзакция завершается ошибкой и откатывается назад. Это обусловлено тем, что оба ограничения проверяются при выполнении операции COMMIT.

2-16-7-5933277

Пример 4. Установите статус IMMEDIATE для обоих ограничений, которые были заданы в предыдущем примере как DEFERRED.

    

SET CONSTRAINTS ALL IMMEDIATE;

2-16-8-4644787

При попытке вставить строку, которая нарушает любое из ограничений sal_ck или bonus_ck, отображается ошибка.

    

INSERT INTO emp_new_sal VALUES(110, -1);

2-16-9-9520493

Примечание. Если таблица создается без указания задержки ограничения, тогда ограничение проверяется сразу в конце каждой инструкции. Например, если для инструкции CREATE TABLE таблицы newemp_details не задать возможность задержки ограничения newemp_det_pk, тогда ограничение проверяется незамедлительно.

     CREATE TABLE newemp_details(emp_id NUMBER, emp_name VARCHAR2(20),

CONSTRAINT newemp_det_pk PRIMARY KEY(emp_id));

При попытке отложить ограничение newemp_det_pk, которое не допускает задержку, отображается следующая ошибка:

    

SET CONSTRAINT newemp_det_pk DEFERRED;

2-16-10-1102036

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

Похожие записи