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

INITIALLY DEFERREDОткладывает проверку ограничения до окончания транзакции
INITIALLY IMMEDIATEПроверяет ограничение в конце выполнения инструкции
Разница между параметрами 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);

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

    COMMIT;

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

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

    

SET CONSTRAINTS ALL DEFERRED;

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

    

INSERT INTO emp_new_sal VALUES(90,5);

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

    

COMMIT;

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

    

SET CONSTRAINTS ALL IMMEDIATE;

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

    

INSERT INTO emp_new_sal VALUES(110, -1);

Примечание. Если таблица создается без указания задержки ограничения, тогда ограничение проверяется сразу в конце каждой инструкции. Например, если для инструкции 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;

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

Статьи по теме
Комментарии
Написать

(обязательно)

(обязательно)

Это не спам (обязательно)