可以在触发器中使用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一起使用,但上述相同的原理适用.