表table字段有**(id,column1,column2,column3)**
id为主键
column1,column2有复合唯一约束
<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 语句的执行逻辑是:
- 首先尝试执行插入操作
- 如果遇到主键/唯一键冲突,则执行更新操作
- 如果没有冲突,则插入成功
因为必须先执行了插入操作,然后我又没设置id值,所以报错了。
解决办法:
我这里直接将id设置为了自增,这样就正常了。文章来源:https://www.toymoban.com/news/detail-703097.html
总结:
使用ON DUPLICATE KEY UPDATE时一定要注意表中的必填值,执行逻辑最先是插入操作,很容易报错。文章来源地址https://www.toymoban.com/news/detail-703097.html
到了这里,关于记录mysql ON DUPLICATE KEY UPDATE 时的小坑以及其底层处理逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!