📜  MySQL在重复密钥更新上插入

📅  最后修改于: 2020-11-17 02:30:31             🧑  作者: Mango

MySQL在重复密钥更新上插入

Insert on Duplicate Key Update语句是MySQL中INSERT语句的扩展。当我们在SQL语句中指定ON DUPLICATE KEY UPDATE子句,并且一行将在UNIQUE或PRIMARY KEY索引列中导致重复的错误值时,将对现有行进行更新。

换句话说,当我们在表中插入新值,并导致在UNIQUE或PRIMARY KEY列中出现重复行时,我们将收到一条错误消息。但是,如果我们在SQL语句中使用ON DUPLICATE KEY UPDATE子句,它将使用新的行值更新旧行,无论它具有唯一键还是主键列。

例如,如果列col1定义为UNIQUE并在表tab1中包含值10,则在执行以下两个语句后,我们将获得类似的效果:

mysql> INSERT INTO tab1 (col1, col2, col3) VALUES (10,20,30) ON DUPLICATE KEY UPDATE col3=col3+1;

mysql> UPDATE tab1 SET col3=col3+1 WHERE col1=1;

它确保如果插入的行与表中的多个唯一索引匹配,则ON DUPLICATE KEY语句仅更新第一个匹配的唯一索引。因此,不建议在包含多个唯一索引的表上使用此语句。

如果表包含AUTO_INCREMENT主键列,并且ON DUPLICATE KEY语句尝试插入或更新行,则Last_Insert_ID()函数将返回其AUTO_INCREMENT值。

以下是MySQL中在重复键更新语句上插入的语法:

INSERT INTO table (column_names)
VALUES (data)
ON DUPLICATE KEY UPDATE 
column1 = expression, column2 = expression…;

用这种语法,我们可以看到,只要INSERT语句发现重复的行,它只会添加具有列-值对分配的ON DUPLICATE KEY UPDATE子句。 ON DUPLICATE KEY UPDATE子句的工作首先尝试将新值插入行中,如果发生错误,它将使用新行值更新现有行。

VALUES()函数仅在此子句中使用,在任何其他上下文中均没有任何意义。它从INSERT部分返回列值,对于多行插入特别有用。

MySQL根据给定的操作,使用ON DUPLICATE KEY UPDATE语句给出受影响的行数:

  • 如果我们将新行插入到表中,它将返回一个受影响的行。
  • 如果将现有行更新到表中,它将返回两个受影响的行。
  • 如果我们使用表中的当前值更新现有行,则它将返回受影响的行数0。

MySQL INSERT ON DUPLICATE KEY示例

让我们借助示例来了解MySQL中INSERT ON DUPLICATE KEY UPDATE子句的工作方式。

首先,使用以下语句创建一个名为“ Student”的表:

CREATE TABLE Student (
  Stud_ID int AUTO_INCREMENT PRIMARY KEY,
  Name varchar(45) DEFAULT NULL,
  Email varchar(45) DEFAULT NULL,
  City varchar(25) DEFAULT NULL
);

接下来,将数据插入表中。执行以下语句:

INSERT INTO Student(Stud_ID, Name, Email, City) 
VALUES (1,'Stephen', 'stephen@javatpoint.com', 'Texax'), 
(2, 'Joseph', 'Joseph@javatpoint.com', 'Alaska'), 
(3, 'Peter', 'Peter@javatpoint.com', 'california');

执行SELECT语句以验证插入操作:

SELECT * FROM Student;

我们将获得以下输出,其中表中有三行:

同样,使用以下查询在表中再添加一行:

INSERT INTO Student(Stud_ID, Name, Email, City) 
VALUES (4,'John', 'john@javatpoint.com', 'New York');

上面的语句将成功添加行,因为它没有任何重复的值。

最后,我们将在Stud_ID列中添加具有重复值的行:

INSERT INTO Student(Stud_ID, Name, Email, City) 
VALUES (4, 'John', 'john@javatpoint.com', 'New York')
ON DUPLICATE KEY UPDATE City = 'California';

成功执行上述查询后,MySQL会给出以下消息:

Query OK, 2 rows affected.

在下面的图中,我们可以看到行id = 4已经存在。因此,该查询仅用加利福尼亚更新纽约市。