mysql INSERT.... ON DUPLICATE KEY UPDATE 用法

1,543 阅读2分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

INSERT.... ON DUPLICATE KEY UPDATE 的优点和缺点。

  • 再开始之前首先在本地库创建一个test数据表,id为主键,方便后面演示
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

初始化三条数据记录

insert into `test` (id,name,remark ) VALUES(1,'zs','1'); 
insert into `test` (id,name,remark ) VALUES(2,'ls','1'); 
insert into `test` (id,name,remark ) VALUES(3,'ww','1'); 

. insert 插入住建冲突

这个应该是我们在开发中遇到最多的问题,通常的解决方案就是我们在插入之前,会先通过id从数据库中查询一次,如果没有返回值就插入,有返回值就更新

  • 传统的插入方式

图片.png

如果是在代码里面这样会直接抛出异常,我们需要额外处理;

增强的insert;

ps: 若想使用 ON DUPLICATE KEY UPDATE,则该数据表中至少存在一条唯一键或者主键,因为他是insert操作,后面是不能带where条件的,而若想要更新的话,只能使用唯一键或者主键匹配。

1. 首先来看第一种情况,只有一个唯一键或者只有一个索引的情况下,这种情况也比较简单。

insert into `test` (id,name,remark ) VALUES(1,'zs','2') ON DUPLICATE KEY UPDATE remark = '2'; 

图片.png

大家可以看到,这样就不会报错了。

但是在实际开发中,很多时候我们一个表中不只有仅有一个主键可能会有好几个唯一键,这种情况下我们还是用这种方式可以吗? 首先在测试前,我们先给test表name字段加上全表唯一的约束,修改后的数据结构如下;

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

2.主键冲突唯一键不冲突的情况

图片.png 大家可以看到,这种情况也是没有问题的,

图片.png

3.有两个或两个以上的唯一键冲突(主键也算唯一键)

图片.png

可以看到这种情况会报错

4.不存在主键或者唯一键的情况

我们把前面id的主键属性,name的索引都给去掉,看看下面情况如何

图片.png 也是可以的,但是会一直当成插入,且可以插入重复数据,如下图:

图片.png

注意事项

图片.png