2012-01-06 8 views
16

Tengo dos tablas que necesitan los mismos valores exactos para propósitos de desnormalización.MySql actualiza dos tablas a la vez

Aquí está la consulta.

primera tabla

UPDATE Table_One 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 AND lid = 1 LIMIT 1 

segunda tabla

UPDATE Table_Two 
SET win = win+1, streak = streak+1, score = score+200 
WHERE userid = 1 LIMIT 1 

Como se puede ver, la única diferencia entre ambas tablas es su nombre y tabla de dos no tiene el campo lid

todos modos para combinar ambas actualizaciones a solo una?

Respuesta

32

Debe ser posible con una actualización de varias tablas, como se describe en la documentación.

http://dev.mysql.com/doc/refman/5.5/en/update.html

UPDATE Table_One a INNER JOIN Table_Two b ON (a.userid = b.userid) 
SET 
    a.win = a.win+1, a.streak = a.streak+1, a.score = a.score+200, 
    b.win = b.win+1, b.streak = b.streak+1, b.score = b.score+200 
WHERE a.userid = 1 AND a.lid = 1 AND b.userid = 1 

Nota: Multi-tabla no soporta LIMIT, así que esto podría causar más dolor dependiendo de los detalles.

Los procedimientos almacenados o las transacciones pueden ser una mejor solución.

1

Son dos consultas separadas, por lo que deben tratarse como tales. Lamento decirlo, pero si está actualizando dos tablas con datos idénticos, probablemente haya una mejor manera de diseñar su base de datos. Recuerde mantener su programación DRY.

Editar: Debería retraer eso; puede usarlo para varias tablas, pero no puede usar ORDER BY o LIMIT.

+0

Veo lo que quiere decir, pero en nuestro caso, reseteamos la puntuación de la tabla 1 muy a menudo. La tabla dos son los puntajes permanentes, por eso necesitamos dos tablas. Es solo que tengo 5 consultas de actualización en una fila (proceso por lotes) y me preguntaba si podría limitar los viajes a la base de datos. – user962449

+1

¿No sería más fácil agregar un campo a la tabla que hace el mismo trabajo, que de forma predeterminada es '1', pero luego se establece en' 0' cuando necesita "reiniciar" la tabla. –

+0

@ user962449 Se encontró con esto mientras buscaba una solución similar. Esta respuesta es incorrecta, y el autor la señala como tal. Deberías aceptar una mejor respuesta más abajo. –

8

Si hay una relación uno a uno o uno a muchos relación de Table_One a Table_Two, esto funcionaría:

UPDATE Table_One T1, Table_Two T2 
SET T1.win = T1.win+1, T1.streak = T1.streak+1, T1.score = T1.score+200, 
    T2.win = T2.win+1, T2.streak = T2.streak+1, T2.score = T2.score+200 
WHERE T1.userid = 1 AND T1.lid = 1 AND T2.userid = T1.userid; 
0

Si usted puede unirse a las tablas, a continuación, puede crear una vista de dos tablas, a continuación, actualizar a través de esa vista. En su ejemplo, parece que userid podría ser una clave adecuada.

Al crear la vista, deberá mantener el following guidelines.

Cuestiones relacionadas