sqlite ON CONFLICT ABORT和FAIL之间的区别

时间:2012-07-06 23:03:02

标签: sqlite conflict

来自http://www.sqlite.org/lang_conflict.html

  

ABORT   当发生适用的约束冲突时,ABORT解析算法将使用SQLITE_CONSTRAIT错误中止当前SQL语句,并退出当前SQL语句所做的任何更改;但保留同一事务中先前SQL语句引起的更改,并且事务保持活动状态。这是默认行为,行为禁止使用SQL标准。

     

FAIL   当发生适用的约束冲突时,FAIL解析算法将使用SQLITE_CONSTRAINT错误中止当前的SQL语句。但是,FAIL解决方案不会撤消先前更改的SQL语句的更改,也不会结束事务。例如,如果UPDATE语句在尝试更新的第100行遇到约束违规,则会保留前99行更改,但不会发生对行100及更高行的更改。

两者都保留在导致约束违规并且不结束事务的语句之前所做的更改。因此,我认为唯一的区别是FAIL解决方案不允许进行进一步的更改,而ABORT只备份冲突的语句。我做对了吗?

1 个答案:

答案 0 :(得分:15)

答案很简单:FAIL不会回滚当前语句所做的更改。

考虑这两个表:

CREATE TABLE IF NOT EXISTS constFAIL (num UNIQUE ON CONFLICT FAIL);
CREATE TABLE IF NOT EXISTS constABORT (num UNIQUE ON CONFLICT ABORT);
INSERT INTO constFAIL VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10);
INSERT INTO constABORT VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10);

声明

UPDATE constABORT SET num=num+1 WHERE num<10

会失败并且什么也不会改变。 但是这个声明

UPDATE constFAIL SET num=num+1 WHERE num<10

将更新第一行,然后失败并更新1行,因此新值为2,3,4,5,6,7,8,9,10