Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Funcion Delete en 5 tablas en 1 consulta

Estas en el tema de Funcion Delete en 5 tablas en 1 consulta en el foro de Mysql en Foros del Web. Hola, Estoy intentando eliminar los registros de 5 tablas relacionadas a un id, en una misma consulta con el siguiente query: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: ...
  #1 (permalink)  
Antiguo 14/02/2017, 14:21
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 4 meses
Puntos: 0
Pregunta Funcion Delete en 5 tablas en 1 consulta

Hola,

Estoy intentando eliminar los registros de 5 tablas relacionadas a un id, en una misma consulta con el siguiente query:

Código MySQL:
Ver original
  1. DELETE a1, a2, a3, a4, a5
  2.             FROM proyectos AS a1
  3.             INNER JOIN servicios AS a2
  4.             INNER JOIN pagos AS a3
  5.             INNER JOIN gastos AS a4
  6.             INNER JOIN sueldos AS a5
  7.             WHERE a1.id_pro=a2.id_pro
  8.             AND a1.id_pro=a3.id_pro
  9.             AND a1.id_pro=a4.id_pro
  10.             AND a1.id_pro=a5.id_pro
  11.             AND a1.id_pro LIKE ". $request['id_pro'];

La consulta funciona solo si existen registros en todas las tablas, pero no siempre habrá registros en todas, por lo que si sueldos no tiene ningún registro asociado a ese id, la consulta no borra en ninguna de las 5. No sabría como agregar condicionales o quizás estoy enfocando mal la consulta. Gracias
__________________
Aquí voy a escribir mi firma
  #2 (permalink)  
Antiguo 14/02/2017, 14:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Funcion Delete en 5 tablas en 1 consulta

No se puede hacer un delete de esa forma, los delete solo afectan una tabla a la vez
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 14/02/2017, 15:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Funcion Delete en 5 tablas en 1 consulta

Hola sebandrescc2:

Efectivamente, puedes eliminar registros de esta forma, aunque no te lo recomiendo... esta forma de hacer múltiples eliminaciones utilizando JOIN's se mantiene por estándar de MySQL, pero no todos los DBMS's lo permiten.

Ahora bien, tu problema en realidad radica en que estás utilizando INNER JOIN, por lo tanto, es necesario que haya registros en TODAS Y CADA UNA DE LAS TABLAS para que se haga la eliminación múltiple.

Una alternativa es que utilices LEFT JOIN's... pero puedes tener algunos problemas debido a que estás utlizando muchas tablas... te sugiero que antes de cualquier prueba respaldes tu información por aquello de las malditas dudas.

Además, tienes un "error" con los JOIN's y es que estás omitiendo la cláusula ON, por lo tanto se está haciendo un producto cartesiano entre tus tablas... en lugar de poner las condiciones de igualdad en el WHERE, ponlas en el ON, que es donde deberían ir. también, en la medida de lo posible EVITA el uso de ALIAS... nada te cuesta poner el nombre completo de tus tablas y eso autodocumenta la consulta.

Entonces tu consulta quedaría más o menos así:

Código MySQL:
Ver original
  1. DELETE proyectos, servicios , pagos , gastos , sueldos
  2. FROM proyectos
  3. LEFT JOIN servicios ON proyectos .id_pro = servicios .id_pro
  4. LEFT JOIN pagos ON proyectos.id_pro = pagos .id_pro
  5. LEFT JOIN gastos ON proyectos.id_pro = gastos .id_pro
  6. LEFT JOIN sueldos ON proyectos.id_pro = sueldos.id_pro
  7. proyectos.id_pro LIKE ". $request['id_pro'];

Finalmente una pregunta, ¿es necesario que hagas una comparación tipo LIKE? es decir, LIKE se utiliza para búsqueda de patrones, utilizando operadores comodín como % o _, si sólo vas a poner valores "fijos" utiliza = en lugar de LIKE:

es decir, en lugar de poner

Código:
proyectos_id_pro LIKE '1'
pon

Código:
proyectos_id_pro = '1'
haz la prueba y nos comentas.

Saludos
Leo.
  #4 (permalink)  
Antiguo 14/02/2017, 19:13
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Funcion Delete en 5 tablas en 1 consulta

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola sebandrescc2:

Efectivamente, puedes eliminar registros de esta forma, aunque no te lo recomiendo... esta forma de hacer múltiples eliminaciones utilizando JOIN's se mantiene por estándar de MySQL, pero no todos los DBMS's lo permiten.

Ahora bien, tu problema en realidad radica en que estás utilizando INNER JOIN, por lo tanto, es necesario que haya registros en TODAS Y CADA UNA DE LAS TABLAS para que se haga la eliminación múltiple.

Una alternativa es que utilices LEFT JOIN's... pero puedes tener algunos problemas debido a que estás utlizando muchas tablas... te sugiero que antes de cualquier prueba respaldes tu información por aquello de las malditas dudas.

Además, tienes un "error" con los JOIN's y es que estás omitiendo la cláusula ON, por lo tanto se está haciendo un producto cartesiano entre tus tablas... en lugar de poner las condiciones de igualdad en el WHERE, ponlas en el ON, que es donde deberían ir. también, en la medida de lo posible EVITA el uso de ALIAS... nada te cuesta poner el nombre completo de tus tablas y eso autodocumenta la consulta.

Entonces tu consulta quedaría más o menos así:

Código MySQL:
Ver original
  1. DELETE proyectos, servicios , pagos , gastos , sueldos
  2. FROM proyectos
  3. LEFT JOIN servicios ON proyectos .id_pro = servicios .id_pro
  4. LEFT JOIN pagos ON proyectos.id_pro = pagos .id_pro
  5. LEFT JOIN gastos ON proyectos.id_pro = gastos .id_pro
  6. LEFT JOIN sueldos ON proyectos.id_pro = sueldos.id_pro
  7. proyectos.id_pro LIKE ". $request['id_pro'];

Finalmente una pregunta, ¿es necesario que hagas una comparación tipo LIKE? es decir, LIKE se utiliza para búsqueda de patrones, utilizando operadores comodín como % o _, si sólo vas a poner valores "fijos" utiliza = en lugar de LIKE:

es decir, en lugar de poner

Código:
proyectos_id_pro LIKE '1'
pon

Código:
proyectos_id_pro = '1'
haz la prueba y nos comentas.

Saludos
Leo.
Hola Leo, gracias por la respuesta.

Bueno, funcionó correctamente y me queda claro el uso del LEFT JOIN, debo reconocer que sé muy poco de mysql.

Ahora, como no me gusta quedarme con la duda, quisiera saber con respecto a porqué no es recomendable usar este tipo de querys. Yo estoy haciendo un programa en javascript y desde el lado del cliente le advierto y re advierto que los datos se eliminaran. Será eso suficiente?

Lo del like era porque en un momento estaba ocupando texto, pero tienes razón, ahora con id_pro=1 es mas eficiente.

gracias nuevamente por la respuesta
__________________
Aquí voy a escribir mi firma
  #5 (permalink)  
Antiguo 15/02/2017, 11:45
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Funcion Delete en 5 tablas en 1 consulta

Hola de nuevo sebandrescc2:

Me da gusto que haya funcionado el delete para tu caso, pero con respecto a tu pregunta de por qué no es recomendable hacer este tipo de delete's múltiples, aquí hay algunas razones.

1. Rendimiento: cualquier sentencia tipo JOIN (INNER, LEFT O RIGTH) pueden ser muy tardadas si manejas tablas con muchos registros y no tienes un correcto uso de los índices. Tal vez con pocos no sea notorio, pero en la práctica debes tener mucho cuidado de esto.

2. Integridad: Esto va de la mano en realidad con el diseño, si tienes un correcto uso de referencias en tus tablas, puedes simplemente hacer DELETE's en cascada, eliminando un registro PADRE y que automáticamente se eliminen todos los registros HIJOS, sin necesidad de hacer tantos JOINS. Puedes checar un ejemplo bastante simple en esta liga

Sin embargo, como menciona la liga, la parte de los DELETE's en cascada sólo aplican a tablas timo InnoDB, si utilizas tablas tablas MyISAM entonces no puedes hacerlo.

3. Simplicidad. Aunque MySQL te permita hacer DELETE's múltiples, no es común verlo. Lo típico es ver 5 delete's sencillos, uno por cada tabla a tener 1 solo DELETE como es este caso, y el mantenimiento también puede resultar más simple.

Sin embargo, esto es cuestión de gustos, como dice el dicho, hay muchas formas de matar a una mosca, pero utilizar una pistola puede resultar demasiado, tú tienes la última palabra en esto.

Saludos
Leo

Etiquetas: delete, funcion, registro, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:11.