MySQL中insert if not exists防止插入重复记录sql语句写法

插入记录的时候,防止插入重复记录有很多种处理办法:

1、先从数据库查询记录是否存在,不存在则插入
2、在数据库建表的时候,不能重复的字段设置唯一索引,然后不管三七二十一都执行insert语句
3、使用mysql的insert if not exists的sql语句实现

其中1是在代码层面进行处理,实现逻辑就是一个if判断。而2和3则都是在数据库层面进行处理,不同的是2是暴力解决办法,如果数据重复因为有唯一索引的存在,插入会失败;而3则是在数据库中进行数据是否存在的判断,不存在才插入数据。

使用一个简单的例子来介绍3方法的使用,这里先建一个简单的用户表用来测试:

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '姓名',
  `age` int NOT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) COMMENT = '用户表';

我们要实现插入数据时保证name这个字段不能存在重复值,则我们用3方法的插入语句为:

insert into t_user (id, name, age)
select null, '小王', 18
from dual where not exists(
    select id from t_user where name = '小王'
);

上述语句无论执行多少遍,数据表中的数据永远只会有一条。你可能会觉得上面的语法有点奇怪,其实我也这么觉得,不过他确实有效,使用的时候直接复制然后改相应的字段就完事了。

简单解释下上述sql语句:null, '小王', 18是我们需要插入的数据,where name = '小王'是我们用来判断数据是否重复的条件。dual是一个虚拟表的意思,因为我们是直接select数据,这个数据不存在于任何表中,所以我们使用一个虚拟表来放在from后面。

官方文档对dual的解释:https://dev.mysql.com/doc/refman/5.7/en/select.html 直接浏览器搜索dual即可找到。

DUAL is purely for the convenience of people who require that all SELECT statements should have FROM and possibly other clauses.
MySQL may ignore the clauses. MySQL does not require FROM DUAL if no tables are referenced.

上述语句在mybaits中xml的参考样例:

insert into t_user (id, name, age)
select #{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}
from dual where not exists(
    select id from t_user where name = #{name,jdbcType=VARCHAR}
);

觉得内容还不错?打赏个钢镚鼓励鼓励!!👍