Constraint Conflict Resolution in SQLite
Constraint Conflict Resolution in SQLite
在大多数SQL数据库中,如果您在表上有UNIQUE,NOT NULL或CHECK约束,并且您尝试执行违反约束的UPDATE或INSERT,则数据库将中止正在进行的操作,并退出与之关联的任何以前的更改相同的UPDATE或INSERT语句,并返回一个错误。这是SQLite的默认行为,尽管SQLite还允许定义替代方式来处理约束违规。本文将介绍这些替代方法以及如何使用它们。
冲突解决算法
SQLite定义了五个约束冲突解决算法,如下所示:
回滚
发生约束冲突时,会立即发生ROLLBACK,从而结束当前事务,并且该命令将以SQLITE_CONSTRAINT的返回码中止。如果没有事务处于活动状态(除了在每个命令上创建的隐含事务),则此算法与ABORT的工作方式相同。
中止
发生约束违规时,该命令会退出它可能进行的任何先前更改,并以SQLITE_CONSTRAINT的返回码中止。但是没有ROLLBACK被执行,所以在同一个事务内的先前命令的变化被保留。这是SQLite的默认行为。
失败
发生约束冲突时,该命令会以返回代码SQLITE_CONSTRAINT中止。但是,在遇到约束冲突之前,命令对数据库所做的任何更改都会保留,并且不会退出。例如,如果UPDATE语句在第100行尝试更新时遇到约束违规,则保留前99行更改,但不会更改为第100行。
忽视
发生约束冲突时,不会插入或更改包含约束冲突的一行。但是该命令继续正常执行。包含约束冲突的行之前和之后的其他行继续正常插入或更新。没有错误返回。
更换
当发生UNIQUE约束冲突时,在插入或更新当前行之前删除导致违反约束的预先存在的行。因此插入或更新总是会发生。该命令继续正常执行。没有错误返回。
SQLite在公共领域。