2012-06-27 16 views
13

私はテーブルを持っています(name, date, stat1, stat2, stat3)(name, date)はPKです。行を挿入すると重複したキーが表示され、3つの統計を合計する必要があります。私はJavaのPreparedStatementで次のクエリを使用します:重複キーのMySQL挿入行は、複数の列を更新します

INSERT INTO tb (name, date, stat1, stat2, stat3) 
VALUES (?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE stat1 = stat1 + ?, stat2 = stat2 + ?, stat3 = stat3 + ? 

これを達成するためのより簡潔なクエリがありますか?私はクエリを単純化しているので、そこには10以上の統計があります。

答えて

26
INSERT INTO tb (name, date, stat1, stat2, stat3) 
VALUES (?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE stat1 = stat1 + VALUES(stat1), stat2 = stat2 + VALUES(stat2), stat3 = stat3 + VALUES(stat3) 
+1

です。しかし、すべての統計を繰り返す必要はありませんか? – DrXCheng

+1

悲しいことに、メタ構文はありません。列挙は可能です。 – vearutop

+0

これは古い質問ですが、別のオプションでは統計情報を文字列に書き込んだり、分割してループしたりする手順があります。少ないコードではないかもしれませんが、よりダイナミックになります。 – inarilo

0

計算された列(合計)を追加し、それをあなたのPKに含めます。

しかし、これはあなたのテーブルを非正規化します。あなたがDUPLICATE KEY UPDATE ON指定して、行がUNIQUEインデックスまたはPRIMARY KEY内の重複値を引き起こすことに挿入されている場合は、MySQLは実行代理キーを使用して、SELECT

-2

で計算を行うことができます古い行の更新。

テーブルに挿入(A、B、C)の値に(1,2,3) :カラムAがUNIQUEとして宣言され、値1が含まれている場合、例えば、次の2つのステートメントは同様の効果を有しますデュプリケートキー更新c = c + 1;

等価更新クエリは、以下のように

UPDATEテーブル集合C = C + = 1です。

とB列が一意である場合、同等の更新クエリは次のようになり、

UPDATEテーブルの集合C = C + 1 WHERE = 1 OR B = 2 LIMIT 1。

+0

あなたは既に同じ回答[ここ](http://stackoverflow.com/questions/20672203/insert-or-if-column-combination-exists-update/20674595#20674595)を投稿しています。この質問が似ていると感じる場合は、代わりにそれを複製としてフラグを立てます。 –

関連する問題