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

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

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>

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

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

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

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

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

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

解决办法

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

总结

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

相关推荐
·云扬·7 小时前
MySQL Binlog落盘机制深度解析:性能与安全性的平衡艺术
android·mysql·adb
霖霖总总8 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
それども9 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
·云扬·9 小时前
MySQL Binlog 配置指南与核心作用解析
数据库·mysql·adb
天空属于哈夫克310 小时前
Java 版:利用外部群 API 实现自动“技术开课”倒计时提醒
数据库·python·mysql
luoluoal10 小时前
基于深度学习的web端多格式纠错系统(源码+文档)
python·mysql·django·毕业设计·源码
crossaspeed12 小时前
MySQL-索引
mysql
这周也會开心12 小时前
Redis与MySQL回写中的数据类型存储设计
数据库·redis·mysql
计算机学姐12 小时前
基于SpringBoot的民宿预定管理系统【三角色+个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·mysql·信息可视化·intellij-idea·推荐算法
qq_3363139313 小时前
javaweb-web基础(springboot入门)
java·开发语言·mysql