mysql 避免重复插入

mysql 避免重复插入

mysql 避免重复插入的方式有这样几种

“1. 使用 ignore 关键字

  1. 使用 replace 关键字
  2. 使用 on duplicate key update

使用 ignore 关键字

当表中存在主键或者唯一索引的时候, 避免重复插入的时候,就可以使用以下命令

1
insert ignore into table_name set name = ?, desc = ?

当表中已经存在数据的时候,本次 insert 会被忽略

注意:需要注意的是 insert ignore 在忽略某一次插入的时候自增id 还是会增长的,举例如下:

1
2
3
4
5
6
CREATE TABLE `tb1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '名称',
`modify_time` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> insert into tb1 value(1, "name1", now());
Query OK, 1 row affected (0.02 sec)

mysql> insert into tb1 value(1, "name2", now());
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> select * from tb1;
+----+-------+---------------------+
| id | name | modify_time |
+----+-------+---------------------+
| 1 | name1 | 2018-07-25 13:35:27 |
+----+-------+---------------------+
"1 row in set (0.00 sec)

mysql> insert ignore into tb1 value(1, "name2", now());
Query OK, 0 rows affected, 1 warning (0.01 sec)

使用 replace 关键字

除了 insert ignore 之外还有 replace into 这里也要求表中必须存在 主键 或者 唯一索引

1
replace into table_name set name = 'a', desc = 'b'

表中 name 必须存在 唯一索引 , 如果表中已经存在 name = ‘a’ 的时候, desc 的值将变更为 ‘b’


使用 on duplicate key update

当表中存在主键或者唯一索引的时候, 避免重复插入的时候,还可以使用以下命令

1
insert into table_name(uniq_name, desc) values('exists_name', 'desc') on duplicate key on update count = count+1;

上面的语句在避免重复插入的同时,还可以修改某一字段, 如果不需要修改任何字段,请使用一下语句

1
insert into table_name(uniq_name, desc) values('exists_name', 'desc') on duplicate key on update desc = desc;

可以说 on duplicate key update 能够实现 insert ignorereplace into 的功能!