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

Eliminar registros de 2 tablas simultaneamente

Estas en el tema de Eliminar registros de 2 tablas simultaneamente en el foro de Bases de Datos General en Foros del Web. Hola, quisiera que me ayuden con una consulta que debo realizar en PHP y MySQL. Para la misma dispongo de 2 tablas las cuales están ...
  #1 (permalink)  
Antiguo 19/05/2011, 15:32
Ktulu
Invitado
 
Mensajes: n/a
Puntos:
Pregunta Eliminar registros de 2 tablas simultaneamente

Hola, quisiera que me ayuden con una consulta que debo realizar en PHP y MySQL.
Para la misma dispongo de 2 tablas las cuales están relacionadas mediante un ID pero NO SON FORÁNEAS

TABLA 1: ID | IDNOTICIA | IDTABLA2
TABLA 2: ID | DESCRIPCION | TIPO


La consulta recibe como parámetro un IDPARAMETRO el cual representará el campo IDNOTICIA de la TABLA1 y será la cláusula principal de búsqueda.
Lo que necesito es eliminar TODOS los registros en la TABLA1 donde IDNOTICIA = IDPARAMETRO y a su vez eliminar los registros en la TABLA2 que UNICAMENTE tengan un determinado valor de TIPO y que a su vez esten en relacion con la tabla1 (valor TIPO que indistintamente puede ser parametrizado o especificado dentro de la consulta)

Hasta el momento lo que tengo es:
Código:
DELETE tabla1.*,tabla2.* FROM tabla1, tabla2 WHERE tabla1.id = '".$id."' OR (tabla1.id = '".$id."'  AND tabla1.idtabla2 = tabla2.id AND tabla2.tipo = 'tipoEliminado')
Por algun motivo la consulta me elimina absolutamente todos los registros de la tabla2

Saludos
  #2 (permalink)  
Antiguo 21/05/2011, 10:17
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 10 meses
Puntos: 39
Respuesta: Eliminar registros de 2 tablas simultaneamente

No estoy muy seguro, ya que no suelo enfrentarme a consultas tan raras como esa, pero el error creo que es que tiene una condición compuesta por un OR. ¿Sabes como funcionan las condiciones con un OR?

Te pongo un ejemplo:
condicion1 OR condicion2

Primero se comprueba condicion1 y si es false se comprueba condicion2. Pero si condicion1 es true entonces condicion2 no se comprueba.

En la primera condición que tienes en tu OR solo haces comprobación con datos de la primera tabla, no de la segunda, lo que equivale a hacer "DELETE FROM tabla2" lo cual borra toda la tabla.
  #3 (permalink)  
Antiguo 21/05/2011, 11:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Eliminar registros de 2 tablas simultaneamente

El problema está dado en tu propia propuesta:
Cita:
Lo que necesito es eliminar TODOS los registros en la TABLA1 donde IDNOTICIA = IDPARAMETRO y a su vez eliminar los registros en la TABLA2 que UNICAMENTE tengan un determinado valor de TIPO y que a su vez esten en relacion con la tabla1 (valor TIPO que indistintamente puede ser parametrizado o especificado dentro de la consulta)
Esto es imposible de hacer en una sola consulta, porque las condiciones aplicadas a cada tabla son distintas e incompatibles.

Una forma en que puedes saber anticipadamente lo que será afectado por el DELETE es realizar una consulta con las mismas condiciones. Todo lo que sea devuelto por la consulta será lo que resulte borrado:
Código MySQL:
Ver original
  1. FROM tabla1, tabla2
  2.     tabla1.id = '".$id."' OR
  3.     (tabla1.id = '".$id."'  AND tabla1.idtabla2 = tabla2.id AND tabla2.tipo = 'tipoEliminado')
Tienes que tener en cuenta que el DELETE afectará a todos los registros que componen esa tabla resultado. Como se evalúan como una unidad, si la Tabla1 es afectada en 12 registros, y esos 12 registros están relacionados a 18 registros de la tabla2, pero de esa tabal2 sólo quieres eliminar 4, ese DELETE no puede discriminarlos. Simplemente borrará los 18 porque eso es lo que le estás diciendo.
Por eso son consultas incompatibles.
Un DELETE que borra registros en más de una tabla se debe construir de modo que lo que se borre sea el conjunto resultado completo, en las tablas indicadas. No sólo en una de ellas.
¿Se entiende la idea?

Si el resultado del SELET de prueba incluye más registros a eliminar de los que quieres en una de las tablas, entonces no puedes usar un DELETE, tienes que usar dos o más (dependiendo del caso)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 30/05/2011, 12:37
Ktulu
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Eliminar registros de 2 tablas simultaneamente

Perfecto, muchas gracias por las respuestas, veré como puedo solucionarlo.
Saludos
  #5 (permalink)  
Antiguo 31/05/2011, 22:57
rqd
 
Fecha de Ingreso: julio-2008
Mensajes: 228
Antigüedad: 16 años, 3 meses
Puntos: 8
Respuesta: Eliminar registros de 2 tablas simultaneamente

¿ya probaste crear un indice foreign key con delete cascade?

sería algo así como:

alter table tabla2
FOREIGN KEY (tipo) REFERENCES tabla1(idtabla2) ON DELETE CASCADE

(sólo te pediría checar bien la sintaxis en http://dev.mysql.com/doc/refman/5.5/...nstraints.html)

de esa forma cuando elimines la referencia, se elimina en la otra tabla automáticamente con un solo delete
  #6 (permalink)  
Antiguo 01/06/2011, 05:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Eliminar registros de 2 tablas simultaneamente

El problema de Ktulu no es tanto relacionarlas. El problema es que quiere borrar registros relacionados en base a criterios distintos.
En una tabla quiere que se borren los registros donde el ID de la noticia sea el de un valor determinado, y en el otro quiere que se borren sólo los que en TIPO tengan un valor en especial.
No hay vinculación entre 1:1 entre ambas cosas, por eso no se puede hacer simplemente con una sentencia. No le cierra por ninguna parte.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: eliminacion, mysql, php, simultaneo, tablas, bases-de-datos
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 18:51.