来自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只备份冲突的语句。我做对了吗?
答案 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