来自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