Режим проверки ограничения ссылочной целостности (SET CONSTRAINTS)
Функция
Определение режима проверки ограничения целостности (немедленная проверка или отложенная).
Спецификация
::=Синтаксические правила
-
Модификатор
IMMEDIATEустанавливает режим немедленной проверки ограничений целостности. Используется по умолчанию. -
Модификатор
DEFERREDустанавливает режим отложенной проверки ограничений целостности.
Общие правила
-
Модификатор
DEFERREDотносится только к проверке ограничений целостности. Обработка других ошибок обработки данных выполняется немедленно. -
DEFERREDдействует только для ограничений целостности с признакомNO ACTION(для режимовCASCADE,SET DEFAULT,SET NULLне действует). -
Режим
SET CONSTRAINTS ALL DEFERRED:применяется к проверке ограничений целостности
CHECKиFOREIGN KEYи не применяется для проверки ограничений целостности:-
PRIMARY KEY(наNOT NULL-значениеи отсутствие дубликатов); -
UNIQUE(на отсутствие дубликатов); -
NOT NULL-значений.
-
-
Модификатор
DEFERREDустанавливает режим отложенной проверки ограничений целостности – до окончания текущей транзакции (только поCOMMIT) или до установки режимаIMMEDIATE. -
Режим
IMMEDIATEможет быть установлен в любой момент обработки данных. -
Если задан режим
DEFERRED, и транзакция завершается пользователем поCOMMIT, но в процессе выполненияCOMMITвыявляется нарушение целостности, такая транзакция откатывается (автоматически выполняетсяROLLBACK). -
Подтверждение или откат транзакции (
COMMIT/ROLLBACK) устанавливает режимIMMEDIATE.
Пример
Для составных индексов (sql-скрипт). Общая для всех часть: drop table sec; drop table prim; create table prim( i1 int, ch char(1), j1 int, primary key(i1,j1) ); create table sec( i2 int, ch char(3), j2 int ); alter table sec add FOREIGN KEY (i2,j2) references prim( i1, j1 ); exclusive; // это команда inl-интерфейса SET CONSTRAINTS ALL DEFERRED; 1) добавление значения в таблицу с ссылочным ключом, когда запись отсутствует в основной таблице: exclusive; // это команда inl-интерфейса insert into sec(i2,ch,j2) values(1, 'aaa',1); insert into prim(i1,ch,j1) values(1,'b',1); 2) изменение значения в таблице с ссылочным ключом, когда новое значение отсутствует в основной таблице: insert into prim(i1,ch,j1) values(1,'b',1); insert into sec(i2,ch,j2) values(1,'aaa',1); update sec set j2 = 2, i2 = 3; update prim set j1 = 2, i1 = 3; 3) удаление значения в основной таблице, когда значение присутствует в таблице с ссылочным ключом: insert into prim(i1,ch,j1) values(1,'b',1); insert into sec(i2,ch,j2) values(1,'aaa',1); delete from prim where i1=1 and j1=1; delete from sec where i2=1 and j2=1; 4) изменение значения в основной таблице, когда значение присутствует в таблице с ссылочным ключом: insert into prim(i1,ch,j1) values(1,'b',1); insert into sec(i2,ch,j2) values(1,'aaa',1); update prim set i1=2, j1=3; update sec set i2=2, j2=3; Общая для всех часть: commit; select * from prim; select * from sec;