MySQL 命令之插入重复数据
title: MySQL 之重复插入时更新(ON DUPLICATE KEY UPDATE,和REPLACD)忽略(IGONRE) – LePeng
category: default
tags:
- 无
created_at: 2022-07-12 17:02:21
original_url: http://10.117.49.91/?p=86
mysql中常用的三种插入数据的语句:
1 |
|
插入重复数据时更新
第一种方法:使用语句实现
示例一:插入多条记录
1 |
|
第二种方法: ON DUPLICATE KEY UPDATE (存在则更新,不存在则插入)
ON DUPLICATE KEY UPDATE 语法的目的是为了解决重复性,当数据库中存在某个记录时,则执行 UPDATE 语句,不存在这条记录时,会插入它。所以要有一个判断这条记录是否存在的标准,那就是字段的唯一性,即不能重复,即UNIQUE索引或者primary key(主键)。如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。并且ON DUPLICATE KEY UPDATE是不能写where条件的.
1 |
|
注意:
当使用
ON DUPLICATE KEY UPDATE
时,DELAYED(延迟插入操作 )选项被忽略。DELAYED调节符应用于 INSERT 和 REPLACE 语句。
当DELAYED插入操作到达的时候, 服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户端就可以在数据表被真正地插入记录之前继续进行操作了。
如果读取者从该数据表中读取数据,队列中的数据就会被保持着,直到没有读取者为止。接着服务器开始插入延迟数据行(delayed-row)队列中的数据行。
在插入操作的同时,服务器还要检查是否有新的读取请求到达和等待。如果有,延迟数据行队列就被挂起,允许读取者继续操作。
当没有读取者的时候,服务器再次开始插入延迟的数据行。
这个过程一直进行,直到队列空了为止。ON DUPLICATE KEY UPDATE
为mysql特有选项,其他数据库慎用。
第三种方法:REPLACE (存在则先删除后插入,不存在则插入)
我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误。当然,我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法,必须先使用DELETE语句删除原先的记录,然后再使用INSERT插入新的记录。而在MySQL中为我们提供了一种新的解决方案,这就是REPLACE语句。使用REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。
使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。
在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。
在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。如果返回的值大于2,那说明有多个唯一索引,有多条记录被删除和插入。
REPLACE的语法和INSERT非常的相似,如下面的REPLACE语句是。
1 |
|
上面曾提到REPLACE可能影响3条以上的记录,这是因为在表中有超过一个的唯一索引。在这种情况下,REPLACE将考虑每一个唯一索引,并对每一个索引对应的重复记录都删除,然后插入这条新记录。假设有一个table1表,有3个字段a, b, c。它们都有一个唯一索引。
1 |
|
假设table1中已经有了3条记录
a b c
1 1 1
2 2 2
3 3 3
下面我们使用REPLACE语句向table1中插入一条记录。
1 |
|
在table1中的记录如下
a b c
1 2 3
mysql当插入重复时忽略操作
1、使用ignore关键字
如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用ignore,当有重复记录就会忽略,执行后返回数字0;如果不重复,则插入。
1 |
|