一: INSERT ON DUPLICATE KEY UPDATE

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE

注意:

1:如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
2:如果该表中,由多个唯一索引,需要特别注意,出现重复时则该语句只能更新其中一行记录

如:原有数据表中有数据:

UNIQUE KEY `uk_admin_name` (`admin_name`) USING BTREE,
  UNIQUE KEY `uk_password` (`password`) USING BTREE

执行:

insert into tab_admin(`admin_name`, `password`) value('admin', 'admin888') on duplicate key
update last_ip = '202.0.0.1';

结果:

从上图可以看出:虽然admin,admin888和两行都匹配上了,但是只更新了一行数据,受影响的行: 2

至于为啥优先选择更新:admin_name这个唯一键? 原因:他会按照键的顺序来更新

结论:

1:

如果有多个唯一建存在,则这样的插入相当于:(其中a,b都是唯一键)

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

2:DUPLICATE 插入多行数据

您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT…UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL。

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);

本语句与以下两个语句作用相同:

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE `c`=3; 
INSERT INTO `table` (`a`, `b`, `c`) VALUES (4, 5, 6) ON DUPLICATE KEY UPDATE c=9;

注释:当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

例子:

举个例子,字段a被定义为UNIQUE,并且原数据库表table中已存在记录(2,2,9)和(3,2,1),如果插入记录的a值与原有记录重复,则更新原有记录,否则插入新行:

INSERT INTO TABLE (a,b,c) VALUES

(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
ON DUPLICATE KEY UPDATE b=VALUES(b);
 
结果:
发现(2,5,7)中的a与原有记录(2,2,9)发生唯一值冲突,则执行ON DUPLICATE KEY UPDATE,将原有记录(2,2,9)更新成(2,5,9),将(3,2,1)更新成(3,3,1),插入新记录(1,2,3)和(4,8,2)
影响的行数为:6行
 
待确认:

更新值的时候,像这种create_time根据数据库时间变动的,不会自动更新时间,还是最初插入的时间,需要构造数据的时候,把create_time自己加上。

变更前时间:

变更后时间:

二: REPLACE INTO

原理:插入数据时,如果发现了重复记录,则系统自动先调用了DELETE删除这条记录,然后再用INSERT来插入这条记录,影响的行数为2行,如果没有发现,则直接插入,影响的行数是1行

注意:

REPLACE和INSERT ON DUPLICATE的区别,在于REPLACE会影响多条结果。比如在表中有超过一个的唯一索引。在这种情况下,REPLACE将考虑每一个唯一索引,并对每一个索引对应的重复记录都删除,然后插入这条新记录。假设有一个table1表,有3个字段a, b, c。它们都有一个唯一索引。 
CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE); 
假设table1中已经有了3条记录

a b c 
1 1 1 
2 2 2 
3 3 3

下面我们使用REPLACE语句向table1中插入一条记录。 
REPLACE INTO table1(a, b, c) VALUES(1,2,3); 
返回的结果如下 
Query OK, 4 rows affected (0.00 sec) 
在table1中的记录如下

a b c 
1 2 3 
我们可以看到,REPLACE将原先的3条记录都删除了,然后将(1, 2, 3)插入。

三:使用ignore关键字

原理:如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:

INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test9@163.com', '99999', '9999');

这样当有重复记录就会忽略,执行后返回受影响的行数为0

又如复制表:

INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`;

注意:ignore只提供不插入重复的记录,但是不会更新记录,replace和duplicate可以实现更新记录。

关于唯一建的注意:

1:在MYSQL中UNIQUE索引将会对null字段失效,也就是说(a字段上建立唯一索引):

INSERT INTO `test` (`a`) VALUES (NULL);

是可以重复插入的(联合唯一索引也一样)

2:

二:INSERT IGNORE
1> insert ignore into table(name)  select  name from table2

如:INSERT IGNORE into tab_baidu_label(uid)  select `name` from tab_salary;

注意:如果插入表的字段长度不满足select中查询的字段长度,则字段会被截取(但是不会报错)

2> insert … select … where not exist

根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。例如:

INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

分享一:关于mysql中避免重复插入记录方法的更多相关文章

  1. mysql防止重复插入记录方法总结

    mysql防止重复插入记录方法总结 防止mysql重复插入记录的方法有很多种,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,当然我们也可以在php中加以判断了. ...

  2. Mysql避免重复插入记录方法

    一.mysql replace用法 1.replace into  replace into table (id,name) values('1','aa'),('2','bb')  此语句的作用是向 ...

  3. MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)

    ON DUPLICATE KEY UPDATE  博客 http://blog.csdn.net/jbboy/article/details/46828917

  4. MySql避免重复插入记录的几种方法

    本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,有需要的朋友可以参考一下 方案一:使用ign ...

  5. MySql避免重复插入记录

    今天用python抓取数据入库需要避免重复数据插入,在网上找了一些方法: 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用 ...

  6. MYSQL避免重复插入记录的三种方法

      方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: insert ignore into table_name(ema ...

  7. mysql性能优化总结(MySql避免重复插入记录的几种方法)

    如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age).(area)三个索引,这被称为最佳左前缀特性.因此我们在创 ...

  8. php实现只保留mysql中最新1000条记录

    这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  9. mysql找出重复数据的方法

    mysql找出重复数据的方法<pre>select openid,count(openid) from info group by openid,jichushezhi_id HAVING ...

随机推荐

  1. [NPM] Use npx to run commands with different Node.js versions

    We will use npx to run a package using different versions of Node.js. This can become valuable when ...

  2. Android menu+ anctionbar

    一.概述 Menu,简单来理解就是当你按下手机的"menu"键时所弹出来的窗体,它被广泛应用着,差点儿在每一个应用中都有它的身影. 二.要求 用两种方式实现菜单功能. 三.实现 新 ...

  3. javascript获取数组种最大值?

    Array.prototype.max = function () { return Math.max.apply({}, this) } Array.prototype.min = function ...

  4. 在Foreda8中整合Apche httpd2.4.6和Tomcat7.0.42(使用tomcat-connectors-1.2.37)

    本地Apche httpd2.4.6(http://pan.baidu.com/share/link?shareid=4003375081&uk=34256769)和Tomcat7.0.42是 ...

  5. Genymotion 下载安装常见错误一条龙

    Genymotion 安卓模拟器确实比安卓原生的模拟器快,但是除了快就找不到其他优点了... 曾经尝试在VM虚拟机内的Ubuntu系统里面再运行Genymotion的,主要原因是要FQ去下载一些东西, ...

  6. AngularJS是什么?

    AngularJS扩展了HTML? 看了几天AngularJS的各种中文教程,一直没有理解AngularJS是做什么的. 直到今天了英文文档,才有了初步了解. HTML是静态语言. JavaScrip ...

  7. wepy - 与原生有什么不同($pages,$interceptors)

    wepy内部封装的一些基类,我们要注意以 “$”开头命名,最好不用 关于wepy基类文档,请查看 关于$apply,其实就是主动刷新DOM,来更新数据. 何时使用它? 答. 你为data里面的数据进行 ...

  8. PACS系统简易

    PACS系统 http://baike.baidu.com/link?url=prHBMbyu5W98ET1UGQ0PXXxLebxAeljckFH0pfO_2aODe1UgsrWgRd4Unbopt ...

  9. 修复windows Management Instrumentation(WMI)

    第一步.重建repository文件夹下所有文件,打开“开始”“运行”输入一下命令并回车:1.停止 WMI 服务, net stop winmgmt2.删除repository文件夹下所有文件, %w ...

  10. 【BIRT】使用rptlibrary设置统一数据源

    在使用birt开发报表的过程中我们通常会发现,如果直接在报表中写死数据源的话,那么之后如果数据库服务器发生变更,那么所有的报表都得一一去修改数据源 这是一个相当耗时间的过程. 1.首先新建librar ...