首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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约束冲突时,在插入或更新当前行之前删除导致违反约束的预先存在的行。因此插入或更新总是会发生。该命令继续正常执行。没有错误返回。

代码语言:javascript
复制
 SQLite在公共领域。

扫码关注腾讯云开发者

领取腾讯云代金券