我遇到过有人建议使用单个查询来使用多行ON DUPLICATE KEY UPDATE
。UPDATE
不幸的是,似乎没有人使用干净的 SQL(定义一个明显的主键id
并使用至少两行),因此我无法确认效果令人满意。
假设表中的所有数据都存在并且某些quantity
行会有所不同:
INSERT INTO variations (id, name, quantity)
VALUES
(1, 'John', 4),
(2, 'Amy', 5),
(3, 'Elizabeth', 6)
ON DUPLICATE KEY UPDATE
id=VALUES(id),
name=VALUES(name),
quantity=VALUES(quantity);
如果表中的数量是 1、2 和 3,那么我的构成是上面的查询应该UPDATE
是 4、5 和 6。但是手动运行命令返回Affected rows: 0
并且我的应用程序中的数据毫无疑问不会改变.
说明:
- 这些
name
行的值可能会发生变化,我试图保持代码简单。 - 是主
id
键,没有其他键。 - 如果查询和表行之间所有行的所有数据都相同,则
UPDATE
不必发生。 - 有时只有一列数据可能会更改,有时除此之外的所有列都
id
可能更改。 - 关于
VALUES()
它是否使用$row
(例如来自 PHP)数据以及UPDATE
它是否与行中已有的数据不同,没有任何说明。 - 关于是否必须指定所有列(除了主键或唯一键)没有说明。
- MariaDB 和 MySQL 的文档都留下了一个模糊的、神秘的未知云。
- 我正在运行 MariaDB 10.2.6 (MySQL 5.5.5)。
我很想将代码转储到一个循环中以每行UPDATE
运行一个查询,因为我没有时间从中创建一个巨大的项目。这里或 SO 中的现有线程都没有正确解决多个 UPDATE 单查询问题(使用看起来像可怕的噩梦来构造的示例),所以我希望得到一个可以毫无疑问地澄清这一点的答案,以便我可以从中学习令人沮丧的挑战。case
感谢#danblack 和 dbfiddle.uk 简而言之,我确定我错过了
ON DUPLICATE KEY UPDATE
.必须定义每一列才能
ON DUPLICATE KEY UPDATE
工作!我有效地在表中有列
id
、、、和。我忘了定义其中一列(那不是要求的前半部分)。a
b
c
d
id
不起作用(缺少列):
将工作(具有所有表格列):