sqlite on ABORT 和 FAIL 之间的冲突差异



From http://www.sqlite.org/lang_conflict.html

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

失败 当发生适用的约束冲突时,FAIL 解析算法将中止当前 SQL 语句,并显示SQLITE_CONSTRAINT错误。但是 FAIL 解析不会回退失败的 SQL 语句的先前更改,也不会结束事务。例如,如果 UPDATE 语句在尝试更新的第 100 行上遇到约束冲突,则会保留前 99 行更改,但永远不会发生对第 100 行及更高行的更改。

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

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

考虑以下 2 个表:

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);
INSERT INTO constABORT VALUES (1),(3),(4),(5);

声明

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

会失败,什么也改变不了。但是这个故事

UPDATE constFAIL SET num=num+1 WHERE num<5
将更新第一行,

然后失败并保持 1 行更新,因此新值为 2、3、4、5

最新更新