mysql - 执行 UPDATE 查询时是否可以使用 ON DUPLICATE KEY 功能?

标签 mysql

我熟悉在执行 INSERT 查询时使用 ON DUPLICATE KEY 结构。我想对 UPDATE 查询做同样的事情,但它似乎在 MySQL 中是不允许的,否则我只是不知道语法。

我的表有一个唯一索引,我希望我的 UPDATE 查询更新尽可能多的记录,并忽略或删除会导致重复键的记录。假设的查询看起来像这样:

UPDATE votes SET user = 'foo' WHERE user = 'bar'
  ON DUPLICATE KEY <ignore update or delete row>;

我正在尝试在我的数据库中合并 2 个用户。如果该用户已经对某个主题进行了现有投票,则可以忽略重复投票,但我不希望整个查询在发生这种情况时失败。理想情况下,我想删除任何触发重复键的记录,如果可以将其滚动到查询中,那就更好了。

这将是一个相当罕见的事件,因此如果 UPDATE 中不存在此功能,我愿意接受可以通过多个查询实现我想要的结果的答案。

最佳答案

您可以通过自连接检查这一点:

UPDATE votes AS v1
LEFT JOIN votes AS v2 ON v1.topic = v2.topic AND v2.user = 'foo'
SET v1.user = 'foo'
WHERE v1.user = 'bar'
AND v2.user IS NULL

DEMO

不可能在单个查询中组合使用 UPDATEDELETE。您需要单独执行它们,使用事务来确保原子性。 DELETE 查询应该只删除根据主题重复的记录。

START TRANSACTION;
DELETE v1 FROM votes AS v1
JOIN votes AS v2 ON v1.topic = v2.topic
WHERE v1.user = 'foo' AND v2.user = 'bar';
UPDATE votes SET user = 'foo' WHERE user = 'bar';
COMMIT;

关于mysql - 执行 UPDATE 查询时是否可以使用 ON DUPLICATE KEY 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46984062/

相关文章:

mysql - Visual Studio Express 2008 可以连接到 MySQL 吗?

java - 数据无法从网络服务器加载到 SQLite 数据库中

mysql - 如何在 Rails rake 任务中将参数传递给 mysql 查询?

mysql - 托管网站时 WordPress 数据库连接出错

php - 将特定值写入数据库 X 次?

php - 使用 LEFT JOIN 通过 Form 插入 MySQL

mysql - 如何查询表中某行的列匹配项?

mysql - 如果mysql中某列是某个值,如何禁止更新表?

c# - 通过c#/Dapper读取MySQL数据库时utf8字符不正确

C# 用户名比较(2 个字符串)