18

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

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

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

4

3 に答える 3

40
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)
于 2012-06-27T22:13:57.670 に答える
0

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

ただし、これによりテーブルが非正規化されます。代理キーを使用して、SELECTで計算を行うことができます

于 2012-06-27T22:12:08.100 に答える
-3

ON DUPLICATE KEY UPDATE を指定し、UNIQUE インデックスまたは PRIMARY KEY で値の重複を引き起こす行が挿入された場合、MySQL は古い行の UPDATE を実行します。たとえば、列 a が UNIQUE として宣言され、値 1 が含まれている場合、次の 2 つのステートメントは同様の効果があります。

INSERT INTO テーブル (a、b、c) 値 (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

同等の更新クエリは次のとおりです。

UPDATE テーブル SET c=c+1 WHERE a=1;

a および b 列が一意の場合、同等の更新クエリは、

UPDATE テーブル SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

于 2013-12-19T06:18:49.810 に答える