sqlite ON CONFLICT ABORT和FAIL之间的区别

Dav*_*vid 13 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只备份冲突的语句.我做对了吗?

Joh*_*uhn 16

答案很简单: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);
Run Code Online (Sandbox Code Playgroud)

该声明

UPDATE constABORT SET num=num+1 WHERE num<10
Run Code Online (Sandbox Code Playgroud)

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

UPDATE constFAIL SET num=num+1 WHERE num<10
Run Code Online (Sandbox Code Playgroud)

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