likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 71

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从数据库中查询一次,如果没有返回值就插入,有返回值就更新

  • 传统的插入方式

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

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

增强的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'; 

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

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

但是在实际开发中,很多时候我们一个表中不只有仅有一个主键可能会有好几个唯一键,这种情况下我们还是用这种方式可以吗? 首先在测试前,我们先给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.主键冲突唯一键不冲突的情况

mysql INSERT.... ON DUPLICATE KEY UPDATE 用法 大家可以看到,这种情况也是没有问题的,

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

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

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

可以看到这种情况会报错

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

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

mysql INSERT.... ON DUPLICATE KEY UPDATE 用法 也是可以的,但是会一直当成插入,且可以插入重复数据,如下图:

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

注意事项

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

转载自:https://juejin.cn/post/7164343543056564260
评论
请登录