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的返回值)

相关推荐
剩下了什么13 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥14 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉14 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变14 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
ggabb15 小时前
中文的全息之美:字音藏道,字里见宇宙
sqlite
山岚的运维笔记16 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里17 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科17 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦17 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
WHD30617 小时前
苏州数据库(SQL Oracle)文件损坏修复
hadoop·sql·sqlite·flume·memcached