INSERT … ON DUPLICATE KEY UPDATE

语法描述

INSERT ... ON DUPLICATE KEY UPDATE 用于在向数据库表中插入数据时,如果数据已经存在,则更新该数据,否则插入新的数据。

INSERT INTO 语句是用于向数据库表中插入数据的标准语句;ON DUPLICATE KEY UPDATE 语句用于在表中有重复记录时进行更新操作。如果表中存在具有相同唯一索引或主键的记录,则使用 UPDATE 子句来更新相应的列值,否则使用 INSERT 子句插入新记录。

需要注意的是,使用该语法的前提是需要在表中建立主键约束,以便判断是否有重复记录。同时,更新操作和插入操作都需要设置对应的列值,否则会导致语法错误。

语法结构

  1. > INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
  2. [ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, column3 = value3, ...];

示例

  1. CREATE TABLE user (
  2. id INT(11) NOT NULL PRIMARY KEY,
  3. name VARCHAR(50) NOT NULL,
  4. age INT(3) NOT NULL
  5. );
  6. -- 插入一条新数据,id 不存在,于是录入新数据
  7. INSERT INTO user (id, name, age) VALUES (1, 'Tom', 18)
  8. ON DUPLICATE KEY UPDATE name='Tom', age=18;
  9. mysql> select * from user;
  10. +------+------+------+
  11. | id | name | age |
  12. +------+------+------+
  13. | 1 | Tom | 18 |
  14. +------+------+------+
  15. 1 row in set (0.01 sec)
  16. -- 将一个已经存在的记录的 age 字段增加 1,同时 name 字段保持不变
  17. INSERT INTO user (id, name, age) VALUES (1, 'Tom', 18)
  18. ON DUPLICATE KEY UPDATE age=age+1;
  19. mysql> select * from user;
  20. +------+------+------+
  21. | id | name | age |
  22. +------+------+------+
  23. | 1 | Tom | 19 |
  24. +------+------+------+
  25. 1 row in set (0.00 sec)
  26. -- 插入一条新记录,将 name age 字段更新为指定值
  27. INSERT INTO user (id, name, age) VALUES (2, 'Lucy', 20)
  28. ON DUPLICATE KEY UPDATE name='Lucy', age=20;
  29. mysql> select * from user;
  30. +------+------+------+
  31. | id | name | age |
  32. +------+------+------+
  33. | 1 | Tom | 19 |
  34. | 2 | Lucy | 20 |
  35. +------+------+------+
  36. 2 rows in set (0.01 sec)

限制

  1. INSERT ... ON DUPLICATE KEY UPDATE 仅支持 1 个唯一约束,暂不支持多个唯一约束。
  2. INSERT ... ON DUPLICATE KEY UPDATE 当前还不支持唯一键(Unique key),由于唯一键可以为 NULL,可能会导致一些未知错误。