16

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

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

FAIL 当发生适用的约束冲突时,FAIL 解析算法会中止当前的 SQL 语句并返回 SQLITE_CONSTRAINT 错误。但是 FAIL 解决方案不会撤销之前对失败的 SQL 语句的更改,也不会结束事务。例如,如果 UPDATE 语句在尝试更新的第 100 行遇到约束冲突,则前 99 行更改将被保留,但对第 100 行及以后的行的更改永远不会发生。

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

4

1 回答 1

19

答案很简单: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);
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

于 2013-06-23T10:45:34.710 回答