本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,各位同学可尝试参考。

案一:使用ignore关键字

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

 代码如下 复制代码
1 INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test9@163.com', '99999', '9999');

这样当有重复记录就会忽略,执行后返回数字0

还有个应用就是复制表,避免重复记录:

 代码如下 复制代码
1 INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`;

方案二:使用Replace

语法格式:

 代码如下 复制代码
REPLACE INTO `table_name`(`col_name`, ...) VALUES (...); REPLACE INTO `table_name` (`col_name`, ...) SELECT ...; REPLACE INTO `table_name` SET `col_name`='value',

...算法说明: REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:

尝试把新行插入到表中  当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:  从表中删除含有重复关键字值的冲突行  再次尝试把新行插入到表中  旧记录与新记录有相同的值的判断标准就是: 表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

返回值: REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和 受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。

示例: # eg:(phone字段为唯一索引)

 代码如下 复制代码

REPLACE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test569', '99999', '123');

另外,在 SQL Server 中可以这样处理:

 代码如下 复制代码

if not exists (select phone from t where phone= '1')   insert into t(phone, update_time) values('1', getdate()) else    update t set update_time = getdate() where phone= '1'

更多信息请看:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#replace

方案三:ON DUPLICATE KEY UPDATE

如‍上所写,你也可以在INSERT INTO…..后面加上 ON DUPLICATE KEY UPDATE方法来实现。如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。

例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

 代码如下 复制代码

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

如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:

 代码如下 复制代码

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

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

您可以在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选项被忽略。

示例: 这个例子是我在实际项目中用到的:是将一个表的数据导入到另外一个表中,数据的重复性就得考虑(如下),唯一索引为:email:

 代码如下 复制代码

INSERT INTO `table_name1` (`title`, `first_name`, `last_name`, `email`, `phone`, `user_id`, `role_id`, `status`, `campaign_id`)      SELECT '', '', '', `table_name2`.`email`, `table_name2`.`phone`, NULL, NULL, 'pending', 29 FROM `table_name2`      WHERE `table_name2`.`status` = 1  ON DUPLICATE KEY UPDATE `table_name1`.`status`='pending'

再贴一个例子:

 代码如下 复制代码

1 INSERT INTO `class` SELECT * FROM `class1` ON DUPLICATE KEY UPDATE `class`.`course`=`class1`.`course`

其它关键:DELAYED  做为快速插入,并不是很关心失效性,提高插入性能。  IGNORE  只关注主键对应记录是不存在,无则添加,有则忽略。

更多信息请看:  http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#insert

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

 代码如下 复制代码

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

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

原文地址:http://www.111cn.net/database/mysql/50135.htm

转载于:https://www.cnblogs.com/-lpf/p/5735358.html

MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)相关推荐

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

    案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: 代码如下 复制代码 1 INSERT IGNORE INTO table ...

  2. mysql insert delayed_mysql insert的几点操作(DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE )

    INSERT语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] V ...

  3. MySQL主键自增长报duplicate_MySQL使用on duplicate key update引起主键不连续自增

    innodb_autoinc_lock_mode中有3种模式,0,1,2,数据库默认是1的情况下,每次使用insert into - on duplicate key update 的时候都会把简单自 ...

  4. 深入mysql ON DUPLICATE KEY UPDATE 语法的分析

    mysql "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNI ...

  5. MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况

    保存或更新 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新:如 ...

  6. MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况

    MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句 ...

  7. php on duplicate key,php – ON DUPLICATE KEY UPDATE值;两次插入相同的值

    我试图插入一些值,如果有一个DUPLICATE KEY UPDATE表人.我正在获取值的插入,但它重复值而不是进行更新.输入字段是动态的,可以添加或删除值.但我试图没有重复的价值观.如何插入新值,如果 ...

  8. MariaDB/MySQL防止重复插入相同记录:INSERT IGNORE或者REPLACE

    MySQL防止重复插入相同记录有2种常用的方法. 1 使用 INSERT IGNORE 使用 INSERT IGNORE 可以在插入具有相同主键的数据时不做重复插入. mysql> SELECT ...

  9. mysql重复写入_MYSQL避免重复插入记录的三种方法

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

最新文章

  1. Google用更少标签生成图像,还提出一个用于训练评估GAN的库
  2. 程序员买买买,纸书半价,电子书55折,抢券叠加使用更划算
  3. leetcode67. 二进制求和
  4. 包概念与__init__注意事项
  5. oracle将一个表数据更新时间,Oracle批量更新,将一个表的数据批量更新另一表
  6. (5)ISE软件开发流程(第1天)
  7. 14013.petalinux操作GPIO
  8. system v共享内存
  9. Http通信(HttpClient)
  10. 软考初级程序员---题目(二)
  11. TS Moly Lubricants TSMoly
  12. python-onvif库基本使用
  13. Excel怎么隐藏指定文本单元格整行
  14. 惨兮兮解决mysql安装坑
  15. 一个用python实现的东方时尚(驾校)抢课程序
  16. Mac系统重置快捷键
  17. ubuntu16.04 鼠标右键没有压缩/解压 选项
  18. word页脚显示不全
  19. 在Azure上实现Python应用和数据现代化第1部分:简介
  20. win10计算机联接多个网络,如何设置win10电脑连接两个显示器?

热门文章

  1. select into
  2. python threading.Thread
  3. Zookeeper Python
  4. Linux tar命令
  5. qpython能使用json吗l_[python] 详解Python在使用JSON时需要注意的编码问题
  6. 图片跟着鼠标_百元鼠标玩设计 雷柏V330游戏鼠标试用招募活动
  7. 职场真实故事计划##职场干货# 职场晋升之路
  8. 基础的计算机网络知识
  9. Mysql学习总结(39)——49条MySql语句优化技巧
  10. MyBatis学习总结(2)——使用MyBatis对表执行CRUD操作