摘要:在本教程中,您将学习如何使用 MySQL INSERT ON DUPLICATE KEY UPDATE
语句在向表中插入行时发生UNIQUE
索引中的重复或PRIMARY KEY
错误时更新数据。
MySQL INSERT ON DUPLICATE KEY UPDATE 语句简介
INSERT ON DUPLICATE KEY UPDATE
是 MySQL 对 SQL 标准INSERT
语句的扩展。
当您向表中插入新行时,如果该行导致UNIQUE
索引或PRIMARY KEY
中出现重复,MySQL 将发出错误。
但是,如果您在INSERT
语句中指定ON DUPLICATE KEY UPDATE
选项,MySQL 将使用新值更新现有行。
INSERT ON DUPLICATE KEY UPDATE
语句的语法如下:
INSERT INTO table (column_list)
VALUES (value_list)
ON DUPLICATE KEY UPDATE
c1 = v1,
c2 = v2,
...;
Code language: SQL (Structured Query Language) (sql)
INSERT
语句的唯一补充是ON DUPLICATE KEY UPDATE
子句,您可以在其中指定列值对分配的列表,以防重复。
基本上,该语句首先尝试将新行插入表中。如果发生重复错误,它将ON DUPLICATE KEY UPDATE
子句中指定的值更新现有行。
MySQL 根据其执行的操作返回受影响的行数:
- 如果插入新行,则受影响的行数为 1。
- 如果更新现有行,则受影响的行数为 2。
- 如果使用其当前值更新现有行,则受影响的行数为 0。
要在DUPLICATE KEY UPDATE
子句中使用INSERT
子句中的值,请使用VALUES()
函数,如下所示:
INSERT INTO table_name(c1)
VALUES(c1)
ON DUPLICATE KEY UPDATE c1 = VALUES(c1) + 1;
如果UNIQUE
索引或PRIMARY KEY
中有重复项,上面的语句将c1
的值设置为其由表达式VALUES(c1)
指定的当前值加 1。
MySQL INSERT ON DUPLICATE KEY UPDATE 示例
让我们看一下使用INSERT ON DUPLICATE KEY UPDATE
的示例来了解它的工作原理。
首先,创建一个名为devices
的表来存储网络设备:
CREATE TABLE devices (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
Code language: SQL (Structured Query Language) (sql)
接下来,将行插入devices
表。
INSERT INTO devices(name)
VALUES('Router F1'),('Switch 1'),('Switch 2');
Code language: SQL (Structured Query Language) (sql)
然后,从devices
表中查询数据以验证插入:
SELECT
id,
name
FROM
devices;
Code language: SQL (Structured Query Language) (sql)

现在, devices
表中有三行。
之后,在devices
表中再插入一行。
INSERT INTO
devices(name)
VALUES
('Printer')
ON DUPLICATE KEY UPDATE name = 'Printer';
Code language: SQL (Structured Query Language) (sql)

由于没有重复项,MySQL 会在devices
表中插入一个新行。上面的语句与下面的语句具有相同的效果:
INSERT INTO devices(name)
VALUES ('Printer');
Code language: SQL (Structured Query Language) (sql)
最后,在id
列中插入具有重复值的行。
INSERT INTO devices(id,name)
VALUES
(4,'Printer')
ON DUPLICATE KEY UPDATE name = 'Central Printer';
Code language: SQL (Structured Query Language) (sql)
MySQL 发出以下消息:
2 row(s) affected
Code language: SQL (Structured Query Language) (sql)
由于devices
表中已存在 id 为 4 的行,因此该语句将名称从Printer
更新为Central Printer
。

在本教程中,您学习了如何使用INSERT
语句的ON DUPLICATE KEY UPDATE
选项在表中插入或更新数据。