sqlite 约束 ABORT 和 FAIL 的区别

答案很简单: FAIL 约束对于当前操作已发生的改变不会滚 。

例如创建如下两个表:num 列采用不同的约束

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 语句
UPDATE constABORT SET num=num+1 WHERE num<10

操作会失败,约束为 abort 的表数据没发生任何变化

UPDATE constFAIL SET num=num+1 WHERE num<10

操作失败,但第一行数据操作成功被保留下来了。所以现在的表里的数据为 2, 3, 4, 5, 6, 7, 8, 9, 10