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

相关推荐
爱吃面条的猿1 小时前
MySQL 随机日期/时间生成
数据库·mysql
2501_939909051 小时前
Mysql 主从复制、读写分离
数据库·mysql
k***82511 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
wstcl2 小时前
通过EF Core将Sql server数据表移植到MySql
数据库·mysql·sql server·efcore
故渊ZY2 小时前
从入门到精通:MySQL 核心技术与业务落地实践
mysql
计算机毕设匠心工作室2 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
qq_12498707533 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计
Dxy12393102165 小时前
MySQL连表更新
数据库·mysql
对 酒 当 歌 人 生 几 何5 小时前
Mysql多表连接
数据库·sql·mysql
IT教程资源C5 小时前
(N_128)基于springboot,vue酒店管理系统
mysql·vue·前后端分离·酒店管理系统·springboot酒店