我遇到了这个查询的问题:
INSERT INTO unit_storage (user_id,diagram_id,amount)
SELECT uf.user_id,
uf.diagram_id,
uf.amount
FROM unit_factory uf
WHERE uf.production_finish_time < /*current unix epoch seconds*/
AND uf.user_id = /*provided user id*/ ON DUPLICATE KEY
UPDATE unit_storage.amount=unit_storage.amount+uf.amount
让我们从正在发生的例子以及我想要的效果开始......
从比较值中您可能已经猜到,production_finish_time 是整数列,其中以秒为单位的时间标记某个日期。
查看 unit_factory 表行:
+-----+----------+-------------+---------+-------------------------+--+
| id | user_id | diagram_id | amount | production_finish_time | |
+-----+----------+-------------+---------+-------------------------+--+
| 7 | 10 | 2 | 1 | 1521472903 | |
| 8 | 10 | 2 | 1 | 1521473704 | |
| 9 | 10 | 2 | 1 | 1521473729 | |
| 10 | 10 | 2 | 1 | 1521474294 | |
+-----+----------+-------------+---------+-------------------------+--+
运行查询后,unit_storage 表成为 unit_factory 表的副本:
+-----+----------+-------------+---------+--+
| id | user_id | diagram_id | amount | |
+-----+----------+-------------+---------+--+
| 16 | 10 | 2 | 1 | |
| 17 | 10 | 2 | 1 | |
| 18 | 10 | 2 | 1 | |
| 19 | 10 | 2 | 1 | |
+-----+----------+-------------+---------+--+
虽然我需要的结果是:
+-----+----------+-------------+---------+--+
| id | user_id | diagram_id | amount | |
+-----+----------+-------------+---------+--+
| 16 | 10 | 2 | 4 | |
+-----+----------+-------------+---------+--+
对于期望的结果,正确的查询是什么?
编辑:
根据要求,两个表的索引:
--
-- Indexes for table `unit_storage`
--
ALTER TABLE `unit_storage`
ADD PRIMARY KEY (`id`);
--
-- Indexes for table `unit_factory`
--
ALTER TABLE `unit_factory`
ADD PRIMARY KEY (`id`);
最佳答案
要触发 on duplicate key
,必须有一个键:
ALTER TABLE unit_storage ADD CONSTRAINT key1 UNIQUE (user_id, diagram_id)
这是关于 SQL Fiddle 的一个工作示例.
关于MySQL 在使用 INSERT INTO SELECT ... ON DUPLICATE KEY UPDATE ... SQL 语句时创建新行而不是更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49469347/