2010-12-05 68 views
84

Tengo una función que actualiza tres tablas, pero utilizo tres consultas para realizar esto. Deseo utilizar un enfoque más conveniente para las buenas prácticas.MySQL, actualice varias tablas con una consulta

¿Cómo puedo actualizar varias tablas en MySQL con una sola consulta?

+3

puede ofrecerle un ejemplo del código generado? ¿Hay una clave común entre las tablas? –

+1

Teniendo en cuenta los votos, considere cambiar la respuesta aceptada ... –

Respuesta

-16

Puede hacer esto con un procedimiento almacenado combinando las declaraciones UPDATE en una sola transacción.

+2

Mientras que un procedimiento almacenado funcionaría, mysql admite la actualización con JOIN – DavidScherer

0

Para eso suelen ser los procedimientos almacenados: implementar varias instrucciones SQL en una secuencia. Al usar las reversiones, puede asegurarse de que se tratan como una unidad de trabajo, es decir, se ejecutan todas o ninguna de ellas, para mantener la coherencia de los datos.

+0

¿dónde escribiría el procedimiento? ¿podrías dar un ejemplo? – Adamski

+0

Votó por arriba para explicar la necesidad de la atomicidad: también es importante darse cuenta de que el uso de procedimientos almacenados no garantiza por sí solo la coherencia, aún necesita usar transacciones; Del mismo modo, las transacciones se pueden realizar sin utilizar un procedimiento almacenado, siempre que se realicen a través de la misma conexión. En este caso, el uso de una actualización multi-tabla es aún mejor. – Duncan

0

Cuando dice varias consultas Qué quiere decir varias sentencias SQL como en:

UPDATE table1 SET a=b WHERE c; 
UPDATE table2 SET a=b WHERE d; 
UPDATE table3 SET a=b WHERE e; 

o múltiple función de consulta llama como en:

mySqlQuery(UPDATE table1 SET a=b WHERE c;) 
mySqlQuery(UPDATE table2 SET a=b WHERE d;) 
mySqlQuery(UPDATE table3 SET a=b WHERE e;) 

El primero todo se puede hacer usando una única mySqlQuery llame si eso es lo que quería lograr, simplemente llame a la función mySqlQuery de la siguiente manera:

mySqlQuery(UPDATE table1 SET a=b WHERE c; UPDATE table2 SET a=b WHERE d; UPDATE table3 SET a=b WHERE e;) 

Esto ejecutará las tres consultas con una llamada mySqlQuery().

+0

sí lo es, ¿cómo podría lograr esto? – Adamski

+0

actualicé mi respuesta de acuerdo a su pregunta. –

+0

mySqlQuery() es una función personalizada o en una función incorporada? Quiero saber más sobre esto – Debashis

27

También puede hacer esto con una consulta también utilizando una combinación de este modo:

UPDATE table1,table2 SET table1.col=a,table2.col2=b 
WHERE items.id=month.id; 

Y luego simplemente enviar esta una consulta, por supuesto. Puede leer más sobre las uniones aquí: http://dev.mysql.com/doc/refman/5.0/en/join.html. También hay un par de restricciones para ordenar y limitar las actualizaciones de múltiples tablas que puede leer aquí: http://dev.mysql.com/doc/refman/5.0/en/update.html (solo ctrl + f "join").

345

Tome el caso de dos tablas, Books y Orders. En caso de que aumentemos el número de libros en un orden particular con Order.ID = 1002 en la tabla Orders, también tenemos que reducir ese número total de libros disponibles en nuestro stock por el mismo número en la tabla Books.

UPDATE Books, Orders 
SET Orders.Quantity=Orders.Quantity+2, 
Books.InStock=Books.InStock-2 
WHERE Books.BookID=Orders.BookID 
AND Orders.OrderID = 1002; 
+66

¿Cómo puede no ser la respuesta aceptada? – eddy147

+0

Si quiero incluir "LIMIT" a la consulta SQL, ¿tengo que decir LIMIT 1 o LIMIT 2? – Bluedayz

+1

¿Cuál es la ventaja de hacer esto frente a una transacción? ¡Gracias! – paulkon

26
UPDATE t1 
INNER JOIN t2 ON t2.t1_id = t1.id 
INNER JOIN t3 ON t2.t3_id = t3.id 
SET t1.a = 'something', 
    t2.b = 42, 
    t3.c = t2.c 
WHERE t1.a = 'blah'; 

Para ver lo que esto va a actualizar, puede convertir esto en una instrucción de selección, por ejemplo .:

SELECT t2.t1_id, t2.t3_id, t1.a, t2.b, t2.c AS t2_c, t3.c AS t3_c 
FROM t1 
INNER JOIN t2 ON t2.t1_id = t1.id 
INNER JOIN t3 ON t2.t3_id = t3.id 
WHERE t1.a = 'blah'; 
+7

esta es una respuesta mucho más robusta que la popular, y cubre casos más complicados. – Lizardx

1
UPDATE Table1,Table2 
SET Table1.NAME=Table2.NAME 
WHERE Table1.id=Table2.id ; 
Cuestiones relacionadas