在操作mysql的时候,我们有时候会涉及到对数据进行插入,那么如果表里面有涉及到唯一索引的情况下,插入相同的数据的时候会报错:Duplicate key,如下图是java相关的报错截图
如果是直接操作mysql的话,报错图如下:
那么这个时候我们就相当于是使用mysql的saveOrUpdate方法,此时我们的数据插入逻辑就变成了:
先根据某些条件查询出是否有数据,有的话则进行update,如果没有数据的话,则进行insert操作
如果是在java里面编码的话,那么无形中会增加很多的代码。今天我们介绍一种通用的解决方案,即使用一条sql语句即完成对应的插入或者更新,语法如下:
insert into table(${字段1},${字段2},${字段3}) values(${value1},${value2},${value3}) on DUPLICATE KEY UPDATE ${字段1} = ${value1},${字段2} = ${value2} ....
下面我们来演示一下:
一、首先创建一张表
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、插入一条数据
insert into user(id,name,age) values(1,"李四",12);
可以看到插入没有问题
三、再插入一条李四的数据
我们在表里面把name做了一个唯一索引,所以再执行
insert into user(id,name,age) values(2,"李四",13);
这条sql语句的话,肯定要报错:
此时我们使用on DUPLICATE KEY UPDATE来改写下这条sql
insert into user(id,name,age) values(1,"李四",20) on DUPLICATE KEY UPDATE name = '李四' , age=20;
可以看到sql被更新了
以上就是使用sql方式进行saveOrUpdate的相关方案。
备注:
1、这种方案在一些OA系统里面使用比较广泛,因为不需要太考虑性能问题。
还没有评论,来说两句吧...