MySQLは、INSERT INTO SELECT ... ON DUPLICATE KEY UPDATE ... SQLステートメントを使用すると、更新する代わりに新しい行を作成します。

疲れたエポ

このクエリで問題が発生しました:

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フィドルが

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ