`

ON DUPLICATE KEY UPDATE重复插入时更新

阅读更多

mysql当插入重复时更新的方法:

第一种方法:

 

示例一:插入多条记录

假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:

 

INSERT INTO clients
(client_id,client_name,client_type)
SELECT supplier_id,supplier_name,'advertising'
FROM suppliers
WHERE not exists(select * from clients where clients.client_id=suppliers.supplier_id);
 

示例一:插入单条记录

 

INSERT INTO clients
(client_id,client_name,client_type)
SELECT 10345,'IBM','advertising'
FROM dual
WHERE not exists (select * from clients where clients.client_id=10345);
 

使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。

第二种方法:

 

INSERT 中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选项被忽略。

第三种方法:

 

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语句是插入或更新一条记录。


  REPLACE INTO users (id,name,age) VALUES(123, '赵本山', 50);

  

 

  插入多条记录:


  REPLACE INTO users(id, name, age)

  VALUES(123, '赵本山', 50), (134,'Mary',15);

  REPLACE也可以使用SET语句

  REPLACE INTO users SET id = 123, name = '赵本山', age = 50;
 


  上面曾提到REPLACE可能影响3条以上的记录,这是因为在表中有超过一个的唯一索引。在这种情况下,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

 

分享到:
评论
1 楼 chinaxy1 2017-12-11  

相关推荐

    [mysql]mysql通过on duplicate key update实现批量插入或更新(csdn)————程.pdf

    在MySQL数据库中,`ON DUPLICATE KEY UPDATE` 是一个非常实用的特性,它允许你在执行INSERT语句时,如果插入的数据违反了唯一性约束(即存在相同的唯一索引),则自动执行UPDATE操作来更新已有记录。这个功能在处理...

    mysql数据库Insert语句后面加ON DUPLICATE KEY UPDATE,保证唯一性1

    ON DUPLICATE KEY UPDATE`语句是一种非常实用的机制,它允许你在插入新行的同时处理可能出现的唯一性约束冲突。这个语句主要用于处理唯一索引(包括主键)的情况,当尝试插入的数据与现有数据冲突时,会触发更新已...

    Mysql中Insert into xxx on duplicate key update问题

    如果你想要插入多行记录,并且希望在遇到重复键时更新对应记录,可以这样写: ```sql 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); ```...

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

    mysql “ON DUPLICATE KEY UPDATE” 语法如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列...

    mysql ON DUPLICATE KEY UPDATE语句示例

    在MySQL数据库中,`ON DUPLICATE KEY UPDATE` 是一个非常实用的特性,它允许你在插入新数据时,如果遇到重复的唯一键值,自动执行更新操作,而不是抛出错误。这个功能大大简化了数据处理的流程,特别是当你需要在一...

    MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    - 当指定`ON DUPLICATE KEY UPDATE`时,只有在出现唯一键冲突时才会执行`UPDATE`部分的语句,更新冲突记录的指定字段。 - 示例中,当再次尝试`INSERT`一个`a=3`的记录时,由于`b`字段在`ON DUPLICATE KEY UPDATE`...

    MYSQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例

    `VALUES()`函数在这里用来引用即将被插入的值,确保在冲突时更新正确的值。 需要注意的是,`ON DUPLICATE KEY UPDATE`对于有多个唯一索引的表可能变得复杂,因为可能有多条记录匹配相同的更新条件。在这种情况下,...

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

    当插入的行会导致唯一索引或主键中的重复值时,`ON DUPLICATE KEY UPDATE`部分的语句将会执行,更新指定的列。如果没有冲突,新行就会被插入。 例如,如果`a`是表的主键或唯一索引,下面两个语句效果相同: ```sql...

    mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点实例分析

    在MySQL中,`REPLACE INTO` 和 `INSERT INTO ON DUPLICATE KEY UPDATE` 是两种处理数据插入时冲突的方法,主要用于处理当试图插入一条记录,而该记录的唯一键或主键已经在表中存在的情况。这两种方法都可以实现如果...

    mysql如何实现 如果存在就update更新,不存在再insert插入.zip

    这里,`num`字段将被`new_num`值更新,如果在尝试插入时发现存在重复的键。 `ON DUPLICATE KEY UPDATE`对于处理并发问题特别有用,特别是在高并发的Web应用程序中,如`mybatis`这样的ORM框架中。`mybatis`语法可能...

    Mysql ON DUPLICATE KEY Update

    总结来说,`ON DUPLICATE KEY UPDATE`是MySQL提供的一种高效、灵活的方式来处理可能存在的重复数据问题,避免了因插入重复记录而引发的错误,同时也提供了更新现有数据的便利。在设计数据库时,合理地设置唯一索引,...

    INSERT INTO .. ON DUPLICATE KEY更新多行记录

    当试图插入的记录与现有记录在唯一索引上产生冲突时,`ON DUPLICATE KEY UPDATE` 将触发对已有记录的更新,而不是抛出错误。 首先,我们来看 `ON DUPLICATE KEY UPDATE` 的基本语法。假设我们有一个表格 `TABLE`,...

    insert into … on duplicate key update / replace into 多行数据介绍

    在MySQL数据库中,当我们需要处理批量插入数据时,但又希望在数据已存在时更新其值,可以使用两种特殊语法:`INSERT INTO ... ON DUPLICATE KEY UPDATE` 和 `REPLACE INTO`。这两种方法都可以实现“合并”操作,即在...

    MySQL唯一索引重复插入数据解决方案总结.docx

    MySQL 唯一索引重复插入数据解决方案总结是指在 MySQL 中遇到唯一索引重复插入数据时的解决方案,可以使用 ignore 语句或 on duplicate key update 语句来解决该问题,并且可以根据具体情况选择合适的解决方案。

    mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )

    MySQL中的`INSERT`语句是用于向数据库表中插入新数据的命令,它...而`ON DUPLICATE KEY UPDATE`则适用于需要在插入时保持数据一致性的场景。理解并合理运用这些选项,可以帮助我们更高效、更稳定地管理数据库中的数据。

    MySQL中如何处理重复数据(Duplicate)?

    ON DUPLICATE KEY UPDATE 语句是在 MySQL 中处理重复数据的常用方法。该语句在插入数据时,如果遇到唯一键冲突(即主键或有唯一索引的字段),则会执行更新操作。示例: INSERT INTO table_name (col1, col2, col3...

Global site tag (gtag.js) - Google Analytics