MySQL INSERT ON DUPLICATE KEY UPDATE语句
摘要:在本教程中,您将学习如何在向表中插入一行时,如果UNIQUE索引或PRIMARY KEY错误重复,则如何使用MySQL INSERT ON DUPLICATE KEY UPDATE语句更新数据。
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, ...;
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) );
接下来,将行插入设备表。
INSERT INTO devices(name) VALUES('Router F1'),('Switch 1'),('Switch 2');
然后,从devices表查询数据以验证插入:
SELECT id, name FROM devices;
现在,设备表中有三行。
之后,再在设备表中插入一行。
INSERT INTO devices(name) VALUES ('Printer') ON DUPLICATE KEY UPDATE name = 'Printer';
由于没有重复项,因此MySQL会在devices表中插入新行。
上面的语句与以下语句具有相同的作用:
INSERT INTO devices(name) VALUES ('Printer');
最后,在id列中插入具有重复值的行。
INSERT INTO devices(id,name) VALUES (4,'Printer') ON DUPLICATE KEY UPDATE name = 'Central Printer';
MySQL发出以下消息:
2 row(s) affected
因为设备表中已经存在ID为4的行,所以该语句将名称从"打印机"更新为"中央打印机"。
在本教程中,您学习了如何使用INSERT语句的ON DUPLICATE KEY UPDATE选项在表中插入或更新数据。