记录mysql ON DUPLICATE KEY UPDATE 时的小坑以及其底层处理逻辑

表table 字段有**(id,column1,column2,column3)**
id 为主键
column1 ,column2有复合唯一约束

xml 复制代码
	<insert id="xxx">
        INSERT INTO table (column1,column2,column3)
        VALUES
        <foreach collection="collection" item="i" separator=",">
            (#{i.column1}, #{i.column2}, #{i.column3})
        </foreach>
        AS new
        ON DUPLICATE KEY UPDATE
        column1 = new.column1, column2 = new.column3, column3= new.column3
    </insert>

这里插入一个已经存在的数据(只是column1 ,column2 一样,column3 不一样)

报错:
Field 'id' doesn't have a default value

按理说column1 ,column2 一样应该走更新操作,但是这里走的插入操作,参考了许多文章才知道原因,这里需要弄清楚使用ON DUPLICATE KEY UPDATE 时mysql的处理逻辑。

MySQL中的 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句的执行逻辑是:

  1. 首先尝试执行插入操作
  2. 如果遇到主键/唯一键冲突,则执行更新操作
  3. 如果没有冲突,则插入成功

因为必须先执行了插入操作,然后我又没设置id值,所以报错了。

解决办法 :

我这里直接将id设置为了自增,这样就正常了。

总结 :

使用ON DUPLICATE KEY UPDATE时一定要注意表中的必填值,执行逻辑最先是插入操作,很容易报错。

相关推荐
Decay__14 分钟前
03_MySQL 存储引擎与存储管理 —— InnoDB 深入、表空间/ibd、binlog/redo/undo 与双写缓冲
运维·数据库·sql·mysql·架构
bksczm25 分钟前
MySQL程序架构
数据库·mysql·架构
川石课堂软件测试9 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
1024奇点16 小时前
【仓颉语言入门 · 第二篇 第 12 课】
开发语言·数据库·ide·mysql·开源
冰暮流星17 小时前
mysql之insert优化
数据库·mysql
北方的银狐-Zero17 小时前
OntoL 7.0|面向工业多智能体的语义本体套件,让异构系统真正 “看懂彼此”——OntoL的本体产品矩阵
人工智能·mysql·sqlite·1024程序员节·本体论·本体产品
瑞克-桑切斯18 小时前
4、MySQL 索引与事务
数据库·mysql
二宝哥18 小时前
【问题】本地启动springboot项目启动flowable引擎会提示数据库脚本错误,同事本地启动没有报错(MySQL表明大小写敏感参数)
数据库·mysql
瑞克-桑切斯19 小时前
2、 MySQL 主从复制与读写分离
数据库·mysql