小巧。快速。可靠。
三者选其二。

SQLite 中的约束冲突解决

在大多数 SQL 数据库中,如果您在表上设置了 UNIQUENOT NULLCHECK 约束,并且尝试执行违反该约束的 UPDATEINSERT 操作,则数据库将中止正在进行的操作,撤销与同一 UPDATE 或 INSERT 语句关联的任何先前更改,并返回错误。这是 SQLite 的默认行为,尽管 SQLite 也允许定义处理约束冲突的其他方法。本文介绍了这些替代方法以及如何使用它们。

冲突解决算法

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

ROLLBACK

当发生约束冲突时,会立即发生 ROLLBACK,从而结束当前事务,并且命令以 SQLITE_CONSTRAINT 的返回代码中止。如果未激活任何事务(除了每个命令创建的隐式事务之外),则此算法的工作方式与 ABORT 相同。

ABORT

当发生约束冲突时,命令会撤销其可能做出的任何先前更改并以 SQLITE_CONSTRAINT 的返回代码中止。但不会执行 ROLLBACK,因此同一事务中先前命令的更改将保留。这是 SQLite 的默认行为。

FAIL

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

IGNORE

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

REPLACE

当发生 UNIQUE 约束冲突时,在插入或更新当前行之前,会删除导致约束冲突的预先存在的行。因此,插入或更新始终发生。命令继续正常执行。不会返回错误。

此页面上次修改于 2022-01-08 05:02:57 UTC