2012-06-27 14 views
13

Tengo una tabla (name, date, stat1, stat2, stat3), (name, date) es la PK. Cuando inserte filas, habrá claves duplicadas, y necesito resumir las tres estadísticas. Uso la siguiente consulta con PreparedStatement en Java:fila de inserción de MySQL en clave duplicada actualizar varias columnas

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

¿Hay una consulta más concisa para lograr eso? Como simplifiqué la consulta, hay más de diez estadísticas allí.

Respuesta

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

Es mejor. ¿Pero es posible que no necesite repetir cada estadística? – DrXCheng

+1

Tristemente no hay meta sintaxis, solo es posible la enumeración – vearutop

+0

Veo que esta es una pregunta antigua, pero otra opción es escribir un procedimiento con las estadísticas en una cadena y luego recorrerlas (después de dividirlas). Puede que no sea menos código, pero será más dinámico. – inarilo

0

Agregue una columna calculada (suma) e inclúyala en su PK.

Sin embargo, esto desnormaliza su tabla. Se podría utilizar una clave sustituta y hacer el cálculo en su SELECT

-2

Si especifica EN DUPLICADO KEY UPDATE, y se inserta una fila que causaría un valor duplicado en un índice UNIQUE o PRIMARY KEY, MySQL realiza una ACTUALIZACIÓN de la fila anterior. Por ejemplo, si la columna A se declara como único y contiene el valor 1, las dos instrucciones siguientes tienen efecto similar:

insertar en la tabla (a, b, c) VALORES (1,2,3) EN ACTUALIZACIÓN DE LLAVE DUPLICADA c = c + 1;

la consulta de actualización equivalente es como abajo,

actualización de tabla SET c = c + 1 donde a = 1;

Si A y la columna B es único, equivalente consulta de actualización sería,

actualización de tabla SET c = c + 1 donde a = 1 b = O 2 LIMIT 1;

+0

Ya ha publicado la misma respuesta [aquí] (http://stackoverflow.com/questions/20672203/insert-or-if-column-combination-exists-update/20674595#20674595). Si crees que esta pregunta es similar, márcala como un duplicado. –

Cuestiones relacionadas