MySQL 在使用 INSERT INTO SELECT ... ON DUPLICATE KEY UPDATE ... SQL 语句时创建新行而不是更新行

标签 mysql sql duplicates sql-update sql-insert

我遇到了这个查询的问题:

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/

相关文章:

Mysql复杂的select语句

mysql - 为什么我在更新时得到 "ERROR 1062 (23000): Duplicate entry ' 428 9' for key 1"?

sql - 如何阻止 postgres 表有重复记录,而是将重复记录写入另一个表

mysql - 使用 pg :backups restore 恢复表

mysql - VB.NET:用Mysql数据库部署windows form应用项目可行吗?

mysql - Sequelize : Using truncate and insert within same transaction

大表上的 SQL WHERE -> 先加入小表还是直接在 WHERE 子句中放 FK?

sql - NOSQL 数据库中有存储过程之类的东西吗?

python - 检查文件中的数据是否重复 (Python)

php - 如何在运行时更改 sql_mode