18

我有一张桌子(name, date, stat1, stat2, stat3)(name, date)是PK。当我插入行时,会有重复的键,我需要总结三个统计数据。我在 Java 中对 PreparedStatement 使用以下查询:

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

是否有更简洁的查询来实现这一目标?因为我已经简化了查询,所以那里有十多个统计信息。

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,则以下两个语句具有相似的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

等效的更新查询如下,

更新表 SET c=c+1 WHERE a=1;

如果 a 和 b 列是唯一的,则等效更新查询将是 ,

更新表 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

于 2013-12-19T06:18:49.810 回答