ON CONFLICT语句

这是一个非标准的SQL扩展,只能用在SQLite中。自3.0.0版本增加。该语句也是UPSERT语句的一部分。UPSERT是3.24.0版本增加的、对INSERT语句的非标准扩展。

ON CONFLICT直接用于CREATE TABLE命令,而在UPDATE、INSERT命令中使用OR替代了ON CONFLICT,这样更易于阅读。比如INSERT ON CONFLICT IGNORE实际应为INSERT OR IGNORE

ON CONFLICT子句适用于UNIQUE、NOT NULL、CHECK和PRIMARY KEY约束,但不适用FOREIGN KEY约束。 有5个冲突解决方法:ROLLBACK, ABORT, FAIL, IGNORE和REPLACE,默认是ABORT。

  • ROLLBACK

    当发生适用的约束冲突时,该方法回滚当前事务、撤销当前语句并报告一个SQLITE_CONSTRAINT错误。如果当前没有活动的事务(除去每条查询隐式创建的事务),该方法和ABORT没有区别。

  • ABORT

    当发生适用的约束冲突时,该方法撤销当前语句并报告一个SQLITE_CONSTRAINT错误,同时取消当前查询语句所做的修改,事务内之前的更新操作不受影响。

  • FAIL

    当发生适用的约束冲突时,该方法撤销当前语句并报告一个SQLITE_CONSTRAINT错误,但是该语句之前做的修改不会撤销,也不会结束事务。比如一条更新语句在更新到第100条时发生了约束冲突,之前更新的99条数据保留更新,而在100条以及之后不会再处理。

    FAIL行为仅对唯一性、NOT NULL和CHECK约束有效。外键约束冲突会触发ABORT。

  • IGNORE

    当发生适用的约束冲突时,该方法忽略冲突的行并继续处理后面的数据。对于唯一性、NOT NULL和CHECK约束冲突不会报错,但对外键约束冲突的表现和ABORT一致。

  • REPLACE

    当一个UNIQUE或PRIMARY KEY约束冲突发生时,该方法在插入与更新当前行之前删除导致约束冲突的行,然后继续执行命令。如果发生了NOT NULL约束冲突,该方法则是使用列的默认值代替NULL值。如果列未指定默认值则行为和ABORT一致。如果发生CHECK约束或外键约束冲突,该方法的行为和ABORT一致。

    如果开启了recursive triggers,该方法在删除导致约束冲突的行时会启动delete triggers触发器。那些被删除的行不会回传给update hook指定的回调函数,也不会增加change counter计数。(C语言接口sqlite3_changessqlite3_changes64的返回值)

相关推荐
Leo.yuan2 分钟前
数据目录和数据字典有什么区别?一文讲清
大数据·数据库·人工智能
惜分飞6 分钟前
记录block 0损坏,数据文件大量坏块,使用不当数据库版本恢复等各种操作之后的故障处理---惜分飞
数据库·block0损坏·ora-17503
执笔论英雄11 分钟前
【大模型推理】redis kv cache
数据库·redis·缓存
tiancaijiben27 分钟前
阿里云SAE应用引擎弹性扩缩容完全指南:从手动调控到智能自动化
java·网络·数据库
倔强的石头_36 分钟前
8000 条 SQL 里,180 条外连接语义跑偏——Oracle 迁 KES 那些藏得最深的坑
数据库
逆境不可逃1 小时前
RAG 不只是向量数据库:讲透 Chunk、混合检索、重排、引用与权限治理
数据库·oracle
全堆鸿蒙1 小时前
鸿蒙应用开发实战【36】— 数据查询优化:predicates 链式调用
数据库·harmonyos·鸿蒙系统
91刘仁德1 小时前
MySQL 数据库基础操作知识点整理
数据库·mysql·oracle
IvorySQL9 小时前
PG 日报|新增 VACUUM 全维度统计信息补丁迭代
数据库·人工智能·postgresql·ivorysql
白露与泡影12 小时前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存