likes
comments
collection
share

Mysql执行insert时,不插入重复数据

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

今天遇到一个问题:通过sql语句直接实现重复数据不插入,而不用借助逻辑代码进行判断。

通过查询目前有三种方法可以实现。

一、insert ignore into

前提条件:插入的属性列中包含主键或者唯一索引。

用法:和insert into用法一致,插入时需要指定属性列,否则默认全部属性列值。当根据主键或唯一索引判定重复时,直接忽略该条数据,执行下一条。

例子: 给表设置了主键和唯一索引(id:主键, serial: 设置了唯一索引)

Mysql执行insert时,不插入重复数据

  • 主键重复
    

Mysql执行insert时,不插入重复数据

因为ID为6的数据已存在,所以受影响行数为0,也就意味着不插入。
  • 唯一索引重复
    

Mysql执行insert时,不插入重复数据

插入了两天serial一样的数据信息,可以看到受影响行数为1,也就是说在在插入第二条数据的时候重复直接忽视。

二、replace into

前提条件:插入的属性列中包含主键或者唯一索引。

用法:和insert into用法一致,插入时需要指定属性列,否则默认全部属性列值。当表中存在重复数据,则先删除此行数据,然后插入新的数据,相当于 delete + insert

例子:

  • 主键重复

Mysql执行insert时,不插入重复数据 replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯体12","40110992","陶瓷压力传感器芯体","CPS1184-5bar")

ID重复,修改了type属性列的数据,执行之后再次查看数据库中的数据,发现数据已变更。

Mysql执行insert时,不插入重复数据

  • 唯一索引重复

Mysql执行insert时,不插入重复数据 replace into sensor_core(id, range_type, type, serial, name, model) VALUES(10, "LLP","芯体","40110992","陶瓷压力传感器芯体","CPS1184-5bar")

ID不同,serial相同,执行sql之后,再次查看数据库中的数据,发现ID已变更。

Mysql执行insert时,不插入重复数据

三、insert into ... on duplicate key update...

前提条件:插入的属性列中包含主键或者唯一索引。

用法:该数据库可以以on duplicate key为界限,分为两部分来看。当数据重复时,执行后面的update部分,当数据不存在时,执行insert.

例子:

  • 主键重复

Mysql执行insert时,不插入重复数据

  • 唯一索引重复

Mysql执行insert时,不插入重复数据