MySQL INSERT … ON DUPLICATE KEY UPDATE 语句


<!–

–>

MySQL INSERT … ON DUPLICATE KEY UPDATE 语句

是一个流行的关系型数据库管理系统,它提供了一个 INSERT … ON DUPLICATE KEY UPDATE 语句,使得用户可以在插入记录时根据唯一键进行更新。然而,如果我们想要使用 WHERE 子句来过滤更新,该如何操作呢?

我们先来看一个简单的例子,假设我们有一个表格 student,其中包含 id、name 和 score 三个列。我们希望在向这个表格添加记录时,如果 id 已存在,就将其分数更新为最新值,而不是插入一条新记录。

CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  score INT
);

INSERT INTO student (id, name, score)
VALUES (1, 'Alice', 80)
ON DUPLICATE KEY UPDATE score = VALUES(score); -- 写得更简洁的格式

以上语句执行后,student 表格会包含一条记录:id 为 1,name 为 Alice,score 为 80。如果我们重新运行上述 INSERT 语句并将分数修改为 90,表格中此时的记录将成为 id 为 1,name 为 Alice,score 为 90。这是因为 INSERT 操作并没有引发唯一键的冲突,而 ON DUPLICATE KEY UPDATE 语句将唯一键为 1 的记录的分数更新为 90。

(adsbygoogle = window.adsbygoogle || []).push({});

现在,我们想要根据记录的 name 字段来更新记录的分数,而不是使用唯一键 id。可以使用以下语句:

INSERT INTO student (id, name, score)
VALUES (2, 'Bob', 75)
ON DUPLICATE KEY UPDATE score = VALUES(score)
WHERE name = 'Bob';

然而, 并不允许在 INSERT … ON DUPLICATE KEY UPDATE 语句中使用 WHERE 子句。所以,以上语句会引发一个 语法错误。此时,我们需要使用另一种技巧来实现这个功能:将 WHERE 子句转换为条件表达式。

INSERT INTO student (id, name, score)
VALUES (2, 'Bob', 75)
ON DUPLICATE KEY UPDATE score = IF(name='Bob', VALUES(score), score);

在以上语句中,我们使用了一个条件表达式,它的意思是:当唯一键为 2 的记录的 name 为 Bob 时,将其分数更新为最新值,否则不进行任何操作。

阅读更多:

总结

MySQL INSERT … ON DUPLICATE KEY UPDATE 提供了一个方便的方法,使得用户可以根据唯一键来自动更新记录。如果要使用 WHERE 子句来过滤更新,我们需要使用条件表达式来实现。请注意,我们需要将 WHERE 子句转换为条件表达式,并放置在 ON DUPLICATE KEY UPDATE 语句中。