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

相关推荐
ANYOLY1 小时前
EXPLAIN执行计划详解
mysql
Pluchon1 小时前
硅基计划5.0 MySQL 叁 E-R关系图&联合/多表查询&三大连接&子查询&合并查询
开发语言·数据库·学习·mysql
Gold Steps.1 小时前
MySQL 8+ 日志管理与数据备份恢复实战指南
数据库·mysql·数据安全
不剪发的Tony老师2 小时前
Yearning:一个免费开源的SQL审核平台
数据库·sql·mysql
christine-rr3 小时前
MySQL数据库管理、DDL、DQL、DML、DCL等总结
linux·数据库·mysql
JuneXcy4 小时前
第2章 数据库系统的核心--数据模型
数据库·mysql·oracle
emma羊羊4 小时前
【业务逻辑漏洞】认证漏洞
mysql·网络安全·靶场·业务逻辑漏洞
麦麦大数据4 小时前
D025 摩托车推荐价格预测可视化系统|推荐算法|机器学习|预测算法|用户画像与数据分析
mysql·算法·机器学习·django·vue·推荐算法·价格预测
皮皮冰燃5 小时前
关系数据库-10-[mysql5和mysql8]在windows中安装为服务并共存
windows·mysql
啊森要自信5 小时前
【MySQL 数据库】MySQL用户管理
android·c语言·开发语言·数据库·mysql