mysql INSERT.... ON DUPLICATE KEY UPDATE 用法
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从数据库中查询一次,如果没有返回值就插入,有返回值就更新
- 传统的插入方式
如果是在代码里面这样会直接抛出异常,我们需要额外处理;
增强的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';
大家可以看到,这样就不会报错了。
但是在实际开发中,很多时候我们一个表中不只有仅有一个主键可能会有好几个唯一键,这种情况下我们还是用这种方式可以吗? 首先在测试前,我们先给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.主键冲突唯一键不冲突的情况
大家可以看到,这种情况也是没有问题的,
3.有两个或两个以上的唯一键冲突(主键也算唯一键)
可以看到这种情况会报错
4.不存在主键或者唯一键的情况
我们把前面id的主键属性,name的索引都给去掉,看看下面情况如何
也是可以的,但是会一直当成插入,且可以插入重复数据,如下图:
注意事项
转载自:https://juejin.cn/post/7164343543056564260