SQLite 中的约束冲突解决

在大多数 SQL 数据库中,如果您在表上有UNIQUENOT NULLCHECK约束,并且您尝试执行违反约束的UPDATEINSERT,数据库将中止正在进行的操作,取消与相同的 UPDATE 或 INSERT 语句,并返回错误。这是 SQLite 的默认行为,尽管 SQLite 还允许定义替代方法来处理约束违规。本文描述了这些备选方案以及如何使用它们。

冲突解决算法

SQLite定义了五种约束冲突解决算法如下:

回滚

当发生约束冲突时,会立即发生 ROLLBACK,从而结束当前事务,并且命令中止并返回代码 SQLITE_CONSTRAINT。如果没有事务处于活动状态(除了在每个命令上创建的隐含事务),则此算法的工作方式与 ABORT 相同。

中止

当发生约束冲突时,该命令会取消之前可能做出的任何更改,并以 SQLITE_CONSTRAINT 返回码中止。但是没有执行 ROLLBACK,因此保留了同一事务中先前命令的更改。这是 SQLite 的默认行为。

失败

当发生约束冲突时,命令中止并返回代码 SQLITE_CONSTRAINT。但是,命令在遇到约束违规之前对数据库所做的任何更改都将被保留,并且不会被取消。例如,如果 UPDATE 语句在它尝试更新的第 100 行遇到约束冲突,则前 99 行的更改将被保留,但对第 100 行及以后的行的更改永远不会发生。

忽视

发生约束冲突时,不会插入或更改包含约束冲突的一行。但该命令继续正常执行。包含约束违规的行之前和之后的其他行将继续正常插入或更新。没有返回错误。

代替

当发生 UNIQUE 约束违例时,导致约束违例的预先存在的行在插入或更新当前行之前被删除。因此插入或更新总是发生。该命令继续正常执行。没有返回错误。