在SQL编码中可以在TRIGGER中使用DEFERRABLE吗? DEFERRABLE如何工作?

前端之家收集整理的这篇文章主要介绍了在SQL编码中可以在TRIGGER中使用DEFERRABLE吗? DEFERRABLE如何工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
可以在触发器中使用DEFERRABLE吗?

DEFERRABLE的概念如何运作?

它是在整个事务期间它在所有操作结束时检查约束?

解决方法

看起来你的意思是Postgressql. DEFERRABLE CONSTRAINT的概念是在事务过程中(使用 SET CONSTRAINTS … DEFERRED;命令)可能暂时失效的概念,但约束必须在提交事务时再次有效.

例如,下面有一个FOREIGN KEY约束,强制从Table2.Table1ID到Table1.ID的引用完整性:

CREATE TABLE Table1
(
  ID INT NOT NULL,Name VARCHAR(50),CONSTRAINT PK_Table1 PRIMARY KEY(ID)
);

CREATE TABLE Table2
(
  ID INT NOT NULL,Table1ID INT NOT NULL,CONSTRAINT PK_Table2 PRIMARY KEY(ID),CONSTRAINT FK_Table2_Table1 FOREIGN KEY(Table1ID) REFERENCES Table1(ID) DEFERRABLE
);

通常,如果没有Table1.ID = 2的行,则下面的插入会失败:

INSERT INTO TABLE2(ID,Table1Id,Name) VALUES (2,2,'Foreign Key Violation');

但是,因为CONSTRAINT被定义为DEFERRABLE(并且我们在下面的事务中允许延迟约束),这意味着我们可能会暂时违反约束,前提是在事务提交时满足约束.在下面的示例中,我们通过在表1中插入一个额外的行来解决外键冲突,以平息参照完整性约束.

BEGIN TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO Table2(ID,'Foreign Key Violation Allowed');
INSERT INTO Table1(ID,'Fix the Violation');
COMMIT TRANSACTION;

SqlFiddle of a DEFERRED RI insert here

关于触发器,DEFERRED只能与CONSTRAINT TRIGGERS一起使用,但上述相同的原理适用.

猜你在找的MsSQL相关文章