向数据库插入记录时,有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是saveOrUpdate操作。这种控制可以放在业务层,也可以放在数据库层,大多数数据库都支持这种需求,如Oracle的merge语句,再如本文所讲的MySQL中的INSERT ... ON DUPLICATE KEY UPDATE语句。

       该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,并且表中已经存在了一条记录值为1,下面两个语句会有相同的效果:

[sql] view plain copy
 
 print?mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法
  1. INSERT INTO table (a,b,c) VALUES (1,2,3)  
  2.   ON DUPLICATE KEY UPDATE c=c+1;  
  3.   
  4. UPDATE table SET c=c+1 WHERE a=1;  

       ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。使用ON DUPLICATE KEY UPDATE,最终如果插入了一个新行,则受影响的行数是1,如果修改了已存在的一行数据,则受影响的行数是2。

       如果字段b也被加上了unique index,则该语句和下面的update语句是等效的:

[sql] view plain copy
 
 print?mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法
  1. UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;  

       如果a=1 OR b=2匹配了多行,则只有一行会被修改。通常的,在ON DUPLICATE KEY UPDATE语句中,我们应该避免多个唯一索引的情况。如果需要插入或更新多条数据,并且更新的字段需要根据其它字段来运算时,可以使用如下语句:

[sql] view plain copy
 
 print?mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法
  1. INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)  
  2.   ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);  

       在ON DUPLICATE KEY UPDATE后面使用VALUES()方法,这个语句等同于下面的两个语句:

[sql] view plain copy
 
 print?mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法
  1. INSERT INTO table (a,b,c) VALUES (1,2,3)  
  2.   ON DUPLICATE KEY UPDATE c=3;--1+2  
  3. INSERT INTO table (a,b,c) VALUES (4,5,6)  
  4.   ON DUPLICATE KEY UPDATE c=9;--4+5  

       如果一个表中包含了一个auto_increment的字段,每次insert数据后,可以通过last_insert_id()方法返回最后自动生成的值,如果通过INSERT ... ON DUPLICATE KEY UPDATE语句修改了一条数据,那么再通过last_insert_id()方法获取的值将不正确,实际测试中是多了一个数,比如向表中增加了3条数据,那么通过last_insert_id()方法得到的值是3,但是通过该语句修改了一条数据后,通过last_insert_id()方法得到的值是4。如果想解决该问题,可以通过如下语句:

[sql] view plain copy
 
 print?mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法mysql 插入重复值  INSERT ... ON DUPLICATE KEY UPDATE
    




mysql中primary key重复时的处理办法
  1. INSERT INTO table (a,b,c) VALUES (1,2,3)  
  2.   ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;  

 

       重点是这句id=LAST_INSERT_ID(id)。

       英文原文:https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

    

方案一:使用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`; 
 
、复制旧表的数据到新表(假设两个表结构不一样) 
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表 

mysql中primary key重复时的处理办法

当insert进数据表, 发生唯一key(unique key与primary key)重复时, 会发生duplicate key错误.

 这种情况有三种处理方法, 以下面的数据结构为例子

 

mysql> use test;

mysql> create table `user` (`userid` int(11) DEFAULT NULL, `username` varchar(255) NOT NULL DEFAULT '');

给加上userid列primary key 

mysql> alter table `user` add primary key `userid` (`userid`);

 

插入数据

mysql> insert into `user` values (1, 'eric'), (2, 'jesus'); 

 

现在我要插入或者编辑userid为1的记录, 但我不知道里面是否已经存在该记录.

 

1, 先删除再插入之

mysql> delete from user where userid = 1;

mysql> insert into user values (1, 'xxxxx') ;

 

2, 使用replace into

mysql> replace into user values (1, 'newvalue'); 

这种情况下逻辑是这样的, mysql先判断记录是否存在, 若存在则先删除之, 再自行insert. 所以你能看到这条语句执行后affected rows是2条(当然前提是你的数据表里userid为1的数据只有1条) 

 

3, 使用insert into ... on duplicate key  update

 mysql> insert into user1 values (1, 'newvalueagain') on duplicate key update user1.username = VALUES(username);

这条语句的affected rows也是2.

 

当然还有另外的处理方式就是直接用php来实现,

先select出来, 发现没结果则insert, 否则update.

还可以先update, 发现affected rows是0, 则insert.

 

但明显这俩种办法都没有把工作直接交给mysql处理效率高 。

 

 参考:

http://blog.csdn.net/ghsau/article/details/23557915

 

 

当insert进数据表, 发生唯一key(unique key与primary key)重复时, 会发生duplicate key错误.

 这种情况有三种处理方法, 以下面的数据结构为例子

 

mysql> use test;

mysql> create table `user` (`userid` int(11) DEFAULT NULL, `username` varchar(255) NOT NULL DEFAULT '');

给加上userid列primary key 

mysql> alter table `user` add primary key `userid` (`userid`);

 

插入数据

mysql> insert into `user` values (1, 'eric'), (2, 'jesus'); 

 

现在我要插入或者编辑userid为1的记录, 但我不知道里面是否已经存在该记录.

 

1, 先删除再插入之

mysql> delete from user where userid = 1;

mysql> insert into user values (1, 'xxxxx') ;

 

2, 使用replace into

mysql> replace into user values (1, 'newvalue'); 

这种情况下逻辑是这样的, mysql先判断记录是否存在, 若存在则先删除之, 再自行insert. 所以你能看到这条语句执行后affected rows是2条(当然前提是你的数据表里userid为1的数据只有1条) 

 

3, 使用insert into ... on duplicate key  update

 mysql> insert into user1 values (1, 'newvalueagain') on duplicate key update user1.username = VALUES(username);

这条语句的affected rows也是2.

 

当然还有另外的处理方式就是直接用php来实现,

先select出来, 发现没结果则insert, 否则update.

还可以先update, 发现affected rows是0, 则insert.

 

但明显这俩种办法都没有把工作直接交给mysql处理效率高 。

 

 参考:

http://blog.csdn.net/ghsau/article/details/23557915

 

相关文章:

  • 2021-11-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-08
猜你喜欢
  • 2021-05-21
  • 2022-12-23
  • 2022-12-23
  • 2021-06-19
  • 2022-12-23
  • 2021-09-13
  • 2022-12-23
相关资源
相似解决方案