在SQL编码中可以在TRIGGER中使用DEFERRABLE吗? DEFERRABLE如何
发布时间:2020-12-12 07:26:51 所属栏目:MsSql教程 来源:网络整理
导读:可以在触发器中使用DEFERRABLE吗? DEFERRABLE的概念如何运作? 它是在整个事务期间它在所有操作结束时检查约束? 解决方法 看起来你的意思是PostgresSql. DEFERRABLE CONSTRAINT的概念是在事务过程中(使用 SET CONSTRAINTS … DEFERRED;命令)可能暂时失效的
可以在触发器中使用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一起使用,但上述相同的原理适用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |