Pregunta:
Fecha: 07-10-2016 07:49:11
(En Español)
Votos: 4 - Respuestas: 10 - Vistas: 22 Compartir en: Google Facebook Twitter LinkedIn Link
Actualizar múltiples tablas en una sola consulta UPDATE[Resuelta]
Intento actualizar variaras tablas en una sola consulta, con inner join. Pero no logro mi cometido, me aparece un error, si pueden sugerirme ideas les agradecería.update alumno a inner join informacion_salud i on a.informacion_salud_id_informacion_salud = i.id_informacion_salud inner join caracteristicas c on a.caracteristicas_id_caracteristicas = c.id_caracteristicas inner join ciudad_nacimiento n on a.ciudad_nacimiento_id_ciudad_nacimiento = n.id_ciudad_nacimiento inner join grupo_sanguineo g on a.grupo_sanguineo_id_grupo_sanguineo = g.id_grupo_sanguineo inner join madre m on a.madre_id_madre = m.id_madre inner join padre p on a.padre_id_padre = p.id_padre set a.id_alumno = 115, a.nombre_alumno = "hernando garcia nule", a.edad_alumno = 22, a.fecha_nacimiento=2002-05-21, i.descripcion_salud = "ars", c.descripcion="nadie", n.nombre_ciudad="ninguna", g.descripcion_grupo="ACDD", m.nombre_madre="anastacia", p.nombre_padre="anastaacio garcia" WHERE id_alumno = 114;
Votos: 4 - Respuestas: 10 - Vistas: 22 Compartir en: Google Facebook Twitter LinkedIn Link
Respuestas:
-
Fecha: 08-10-2016 01:50:50 Si quieres actualizar varias tablas en una sola consulta te recomendaría que utilices un procedimiento de almacenado, tengo entendido que inner join solo sirve para hacer vistas un un ejemplo de actualizar varias tablas seria:
CREATE DEFINER=`root`@`localhost` PROCEDURE `nombreDelProcedimiento`( in _var1 date, in _var2 varchar(45), in _var3 int(11) ) BEGIN start transaction; update tabla1 set campo1=_var1 where campo1=_var3; update tabla2 set campo1=_var2 where campo1=_var3; commit; END
Primero defines un nombre al procedimiento, le das elementos de entrada, start transaction y commit lo que hace es si una de las consultas falla no actualiza nada eso nos ayuda para asegurarnos que haya hecho enteramente todas las consultas y no haya inconsistencias de datos en la base de datos. Votos: 2 - Link respuesta -
Fecha: 08-10-2016 06:44:06 Estoy de acuerdo a la propuesta de Alexis
INNER JOIN: es para realizar consulta sql uniendo Tablas Relacionadas. Se utiliza con SELECT.
El utilizar procedimiento de almacenado para la inserción de datos me parece que es acertado.
Saludos Votos: 0 - Link respuesta -
Fecha: 08-10-2016 07:20:22 Hola a todos, si es posible realizar UPDATE de múltiples tablas, combinado con INNER JOIN o no. Veamos algunos ejemplos que seguramente serán esclarecedores (un código vale más que mil palabras):
UPDATE de la tabla usuario y cliente en una sola consulta:
Sin usar alias:
UPDATE usuario INNER JOIN cliente ON(usuario.id = cliente.usuario_id) SET usuario.email = 'info@empresa555.com', cliente.razonsocial = 'Empresa 555' WHERE usuario.id = 1;
Usando alias:
UPDATE usuario us INNER JOIN cliente cl ON(us.id = cl.usuario_id) SET us.email = 'info@empresa777.com', cl.razonsocial = 'Empresa 777' WHERE us.id = 1;
Alternativamente a INNER JOIN se pueden colocar las tablas separadas por coma y relacionarlas en el WHERE (yo no recomiendo esta estructura, ya que en el mejor de los casos se mapea a INNER JOIN y en el peor es menos performante):
UPDATE usuario, cliente SET usuario.email = 'info@empresa555.com', cliente.razonsocial = 'Empresa 555' WHERE usuario.id = cliente.usuario_id AND usuario.id = 1;
Muchas veces cuando dudamos de algún concepto lo mejor es hacer algunas pruebas.
Saludos a todos y buen código! Votos: 4 - Link respuesta -
Fecha: 08-10-2016 13:34:27 Fernando muchas gracias por sacarnos de la sombra de la duda sobre el INNER JOIN con UPDATE.
Entonces tambien seria posible utilizarlo con un DELETE.
Michael lo hace con Alias
Michael García estaria bueno saber cual es el error que da. Votos: 1 - Link respuesta -
Fecha: 08-10-2016 14:20:25 Estimado Miguel: de toda la vida, las instrucciones UPDATE y DELETE solo pueden atender un proceso a la vez, no existe una formula mágica que actualice mas de una tabla al mismo tiempo, sin embargo, puedes utilizar el concepto de TRANSACCIONABILIDAD, esto es utilizado para actualizar mas de una base de datos utilizando un bloque de transacciones, si en algún proceso que encierra dicho bloque generara algún tipo de error, la transacción completa es rechazada, esta solucion puede ser utilizada en un procedimiento o función almacenados, o bien directamente en el codigo, las instrucciones que encierran un proceso transaccional son:
BEGIN TRAN -> que inicia el proceso de transacción
COMMIT -> confirma la aceptación de la transacción completa
ROLLBACK -> rechaza la transacción, no actualizando nada integrado en el bloque transaccional
depende de la base de datos, siempre existe un status de la transacción que nos indica el éxito de la transacción, de forma que podamos utilizar COMMIT para asentar la transacción o ROLLBACK para rechazarla y anular todo el proceso.
recordemos que el bloque transaccional es el que nos permite evitar tener REGISTROS HUERFANOS, efectuados por procesos manuales que no siempre tienen éxito.
por ultimo debes tener en cuenta en tus transacciones la integridad transaccional, que se relaciona directamente con el uso de llaves foráneas, mas si existen reglas de dependencias, que impiden la actualización de una tabla si tiene una relación de dependencia con otra.
si utilizas MYSQL, te recomiendo http://dev.mysql.com/doc/refman/5.7/en/commit.html
y de paso una breve explicacion en: http://www.hermosaprogramacion.com/2014/05/sql-transaccion-que-es/
espero que estas lineas puedan ayudar un poco a resolver tu conflicto con este concepto
saludos desde Guatemala. Votos: 1 - Link respuesta -
Fecha: 10-10-2016 13:56:16 Hola Antonio, si es posible realizar un UPDATE de múltiples tablas en una sola consulta, de hecho si observas el ejemplo que aporta Fernando verás que en un mismo UPDATE actualiza la tabla usuario y cliente, y funciona perfectamente (lo he probado porque yo también pensaba que no era posible, pero si lo es...., muchas gracias Fernando por el completo ejemplo).
Aporte extra: en MySQL se inicia una transacción con la sentencia: START TRANSACTION; (también es posible utilizar BEGIN TRANSACTION, pero esta última es un alias, tradicionalmente en MySQL se utilizo START).
Saludos a todos! Votos: 3 - Link respuesta -
Fecha: 10-10-2016 17:10:32 Gustavo entonces no soy el único que pensaba que no era posible.
Cuando he buscado sobre INNER JOIN la mayoría de los ejemplos que había en la red estaba asociado a SELECT.
Por si alguien mas quiere hacer pruebas con el ejemplo de fernando, les dejo las query que hice, por ahi no esten bien del todo ;)
Creación de base de datos y tablas
-- Base de datos: phpcentral -- CREATE DATABASE IF NOT EXISTS phpcentral DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE phpcentral; -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla cliente -- CREATE TABLE IF NOT EXISTS cliente ( id int(10) unsigned NOT NULL, razonsocial varchar(100) DEFAULT NULL, usuario_id int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla usuario -- CREATE TABLE IF NOT EXISTS usuario ( id int(11) NOT NULL, email varchar(150) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Índices para tablas volcadas -- -- -- Indices de la tabla cliente -- ALTER TABLE cliente ADD PRIMARY KEY (id); -- -- Indices de la tabla usuario -- ALTER TABLE usuario ADD PRIMARY KEY (id); -- -- AUTO_INCREMENT de las tablas volcadas -- -- -- AUTO_INCREMENT de la tabla cliente -- ALTER TABLE cliente MODIFY id int(10) unsigned NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT de la tabla usuario -- ALTER TABLE usuario MODIFY id int(11) NOT NULL AUTO_INCREMENT;
QUERYs para insertar y modificar los datos
Al hacer el UPDATE a mi me daba el siguiente error:
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
Para que no me de el error, antes del update ejecute: SET SQL_SAFE_UPDATES = 0; al finalizar los UPDATE volví a dejar el seteo como estaba con SET SQL_SAFE_UPDATES = 1;
La solución de MySQL. Error code 1175
No sé que riesgo implica en dejarlo permanentemente en SET SQL_SAFE_UPDATES = 0;
use phpcentral; -- Insret insert into cliente (razonsocial, usuario_id) values ("La Razon Social", 1); insert into cliente (razonsocial, usuario_id) values ("Mi razon social", 2); select * from cliente; insert into usuario (email) values ('usuario@email.com'); insert into usuario (email) values ('mirazonsocial@email.com'); select * from usuario; -- Listo ambas tablas el email, razonsocial, usuario_id select U.email, C.razonsocial, C.usuario_id from usuario as U inner join cliente as C on U.id = C.usuario_id; -- UPDATE multiples -- Para que no de Error Code: 1175, Para deshabilitar el modo seguro SET SQL_SAFE_UPDATES = 0; UPDATE usuario INNER JOIN cliente ON(usuario.id = cliente.usuario_id) SET usuario.email = 'info@empresa555.com', cliente.razonsocial = 'Empresa 555' WHERE usuario.id = 1; UPDATE usuario INNER JOIN cliente ON(usuario.id = cliente.usuario_id) SET usuario.email = 'empresa@elmail.com', cliente.razonsocial = 'La emprecita' WHERE usuario.id = 2; -- Vuelvo ha habilitar el modo seguro SET SQL_SAFE_UPDATES = 1;
Estoy probando en hacer un DELETE aun sin buen resultado
Saludos Votos: 1 - Link respuesta -
Fecha: 10-10-2016 17:58:08 estimado Walter:
el modo safe es utilizado para evitar que en la actualización de una tabla (UPDATE o DELETE) utilice como base la llave primaria, cuando esta encendido debes integrar en el WHERE la llave primaria, que generalmente esta integrado por un ID, este concepto NO resuelve el problema de INTEGRIDAD REFERENCIAL, el unico en base de datos que es fiable para actualizar mas de una tabla al mismo tiempo es el PROCEDIMIENTO TRANSACCIONAL, y en el caso de mysql hay que asegurarse que las tablas InNoDB, un procedimiento transaccional, genera un script de transaccion que bloquea temporalmente y por nano segundos, el conjunto de tablas que integran dicho bloque, esto incluye tablas que utilizan SELECT, el bloqueo permite que la transaccion sea ejecutada por un solo proceso, asegurando asi el exito de dicha transaccion y por tanto el resguardo de la integridad transaccional, en el caso que la transaccion fallara en alguno de sus segmentos de lectura o actualizacion, el proceso debera ser rechazado, indicando la disolucion del mismo y dejando todo como estaba antes de la ejecucion del proceso, esto asegura la integridad referencial y por tanto evita la generacion de REGISTROS HUERFANOS, crear un bloque como el que pusiste en el ejemplo NO permite definir el exito total de este, puede que continue luego de un error y alguna tabla quede fuera, o bien se detenga y solo se efectuo una parte del mismo, una vez mas recomiendo leer un poco sobre TRANSACCIONABILIDAD DE DATOS e INTEGRIDAD REFERENCIA creo que podrias ahorrarte muchos dolores de cabeza, por ejemplo cuando grabas un documento que tiene un maestro y uno o varios detalles asociados. espero pueda ser de utilidad, saludos desde Guatemala Votos: 1 - Link respuesta -
Fecha: 10-10-2016 18:31:51 Antonio se te agradece tu buen punto de vista.
Es muy importante mantener la integridad relacional.
En el ejemplo que he dado podrías aplicar tu sugerencia ? Así tenemos un ejemplo
Saludos Votos: 0 - Link respuesta -
Fecha: 10-10-2016 20:44:20 Pues gracias por los aportes y por sacarme de algunas dudas, optaré por el procedimiento almacenado. Un saludo. Votos: 0 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión