记录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时一定要注意表中的必填值,执行逻辑最先是插入操作,很容易报错。

相关推荐
刘胡子大叔5 小时前
MySQL 升到 8.4 前的兼容性自检清单
mysql
for_ever_love__5 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
fish_xk10 小时前
mysql中的表的约束
数据库·mysql
java1234_小锋11 小时前
【技术专题】Mysql8 数据库 - Mysql8 添加,更新,删除数据
数据库·mysql
冰暮流星13 小时前
mysql之索引创建,查看,删除
数据库·mysql
福兮说15 小时前
IP 地址转整数的七个坑:192.168.1.1 算出负数、127.1 也是合法地址、存进 INT 直接溢出
javascript·网络·网络协议·tcp/ip·mysql·golang
Q264336502318 小时前
【有源码】基于Spring Boot和Vue的在线考试与交流系统-教育信息化背景下在线考试与交流一体化平台
java·vue.js·spring boot·mysql·spring·毕业设计·课程设计
都适、隶仁ミ18 小时前
【等保加固】MySQL5.7.38
运维·服务器·mysql·安全·等保
fengkai454519 小时前
十一、MySQL 第 4-7 章
运维·数据库·mysql
ao-weilai20 小时前
MySQL数据库:索引
数据库·mysql