MySql避免重复插入记录

今天用python抓取数据入库需要避免重复数据插入,在网上找了一些方法:

方案一:使用ignore关键字

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

insert ignore into table_name(email,phone,user_id) values(‘[email protected]‘,‘99999‘,‘9999‘),这样当有重复记

录就会忽略,执行后返回数字0,还有个应用就是复制表,避免重复记录:

insert ignore into table(name)  select  name from table2

比如以下表记录是合法的 ignore into语法插入的数据:

+-----+------+------+
| id | name | type |
+-----+------+------+
| 101 | aaa | 1 |
| 102 | bbb | 2 |
| 103 | ccc | 3 |
| 203 | ccc | 3 |
| 202 | bbb | 2 |
| 201 | aaa | 1 |
+-----+------+------+   

如果不加ignore执行insert时如果遇到id有重复的,会报错,因为违反了唯一约束。

方案二:使用Replace

replace的语法格式为:

1. replace into table_name(col_name, ...) values(...)

2. replace into table_name(col_name, ...) select ...

3. replace into table_name set col_name=value, ...

算法说明:

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

1.    尝试把新行插入到表中

2.    当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:

从表中删除含有重复关键字值的冲突行

再次尝试把新行插入到表中

旧记录与新记录有相同的值的判断标准就是:表有一个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,则以下两个语句具有相

同的效果:

mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)

->ON DUPLICATE KEY UPDATE c=c+1;

mysql>UPDATE table SET c=c+1 WHERE a=1;

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

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

mysql> 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。

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)

-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

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

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)

-> ON DUPLICATE KEY UPDATE c=3;

mysql> 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‘

语句的关键地方,都已高亮出来~

再贴一个例子:

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字段上建立唯一索引):

insert into test(a) values(null)

insert into test(a) values(null)

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

原文:http://www.cnblogs.com/zeroone/archive/2012/04/18/2454728.html

ignore

ignore into

ignore

判断是否存在,存在不插入,否则插入。很容易理解,当插入的时候,违反唯一性约束,MySQL不会尝试去执行这条语句

时间: 2024-10-19 22:53:29

MySql避免重复插入记录的相关文章

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

防止mysql重复插入记录的方法有很多种,常用的是ignore,Replace,ON DUPLICATE KEY UPDATE,当然我们也可以在php中加以判断了. 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: 代码如下:  代码如下 复制代码  INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protec

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

本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,各位同学可尝试参考. 案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:  代码如下 复制代码 1 INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protec

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

本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,有需要的朋友可以参考一下 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: 复制代码代码如下: INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protec

MySql避免重复插入记录方法(ignore,Replace,on duplicate key update,not exist)

在MySQL中进行条件插入数据时,可能会用到以下语句,现小结一下.我们先建一个简单的表来作为测试: CREATE TABLE `books` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(200) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `NewIndex1` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.insert ignore int

mysql避免重复插入记录方法

在做网站开发的时候,有的时候需要对某些字段进行唯一性的限制,然后就回产生以下的需求 当数据库中某个字段是唯一的时候,当再次插入同样的数据是,进行更新操作 语法:REPLACE INTO tablename(column) values (values) 下面来看一下样例 1.创建表 mysql>create table t1(id int primary key auto_increment , name varchar(32) ); 2.创建唯一索引 mysql>CREATE UNIQUE

MySQL防止重复插入相同记录

我们在用insert往数据表中插入数据时,为了不重复插入数据,往往先在数据表中查询一下该条数据是否已经存在,若不存在才进行插入. 这样比较麻烦. 找到一个方法:使用 insert if not exists语句,就不需做上述两道工序,轻松防止插入重复数据. 语法: INSERT INTO TABLE (field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS ( SELECT fi

MySQL扩展功能 - 重复插入

replace into为什么不好?先删除,后插曲,删除时会全表扫描吗? 参考来自MySQL官方网络的文档: http://dev.mysql.com/doc/refman/5.0/en/replace.html MySQL uses the following algorithm for REPLACE (and LOAD DATA ... REPLACE): Try to insert the new row into the table While the insertion fails

MySQL 避免重复插入 IGNORE 关键字

最近在写秒杀的时候,考虑一个问题,用户不能重复对一个商品下单>1次,于是想到了电话主键的方式,让他抛异常,而我们则需要屏蔽掉这个异常.于是就有了IGNORE的出现. IGNORE : 若有导致unique key 冲突的记录,则该条记录不会被插入到数据库中. 示例: INSERT IGNORE INTO `test` (`email`, `phone`, `user_id`) VALUES ('test[email protected]', '99999', '9999'); 这样当有重复记录就

mysql避免重复插入的三种方法

在开发中,我们经常遇到这样的需求,如果插入的数据不存在就插入存在就更新(或者不做任何操作).mysql的insert就提供了此功能,不需要我们在自己的业务逻辑代码上做处理.直接用mysql提供的功能来实现即可.猛击下面的链接查看使用方法 http://www.cnblogs.com/zeroone/archive/2012/04/18/2454728.html http://www.sifangke.com/2013/05/mysql-insert-sql/