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

FK - Problema al tratar de eliminar registro.

Estas en el tema de FK - Problema al tratar de eliminar registro. en el foro de Mysql en Foros del Web. - Buenas a tod@s, creo que mi inquietud va en esta seccion del foro si no es asi disculpen, bueno en mi clase de programacion ...
  #1 (permalink)  
Antiguo 21/01/2015, 08:57
 
Fecha de Ingreso: marzo-2013
Mensajes: 32
Antigüedad: 11 años, 1 mes
Puntos: 0
FK - Problema al tratar de eliminar registro.

- Buenas a tod@s, creo que mi inquietud va en esta seccion del foro si no es asi disculpen, bueno en mi clase de programacion web me han asignado crear un CRUD con una BD ya previamente estructurada por el Profesor, ya cree en si todo lo que seria las vista para el usuario (el modulo en el cual el usuario ve la información de la BD, en otras palabras los Select) y bueno decidi seguir con el DELETE, ahora bien yo lo ejecuto de la siguiente forma:

Código MySQL:
Ver original
  1. DELETE FROM tubicacion WHERE DescripUbic='".$keyero."' AND CodEstacion='".$keyer."' AND CodRegion='".$keye."' AND CodUbic='".$key."

- Y esa sentencia me funciona perfecto, pero al trata de ejecutar esta otra:

Código MySQL:
Ver original
  1. DELETE FROM testaciones WHERE DescripEstacion='".$keyero."' AND CodEstacion='".$key."' AND CodRegion='".$keyer."'


Cita:
Editado: Código de programación no permitido en foros de Base de Datos. Leer las reglas del foro, por favor.
- Pues no sucede absolutamente nada, al imprimir un var_dump de esa sentencia me devuelve lo siguiente: string(99) "DELETE FROM testaciones WHERE DescripEstacion='BAMARIS' AND CodEstacion='AM10' AND CodRegion='REAM'"

- Compruebo campo por campo a punta de ojo en la BD y no veo nada raro entonces intente aplicar la sentencia directamente desde el Phpmyadmin en la parte donde dice SQL ejecute:

Código SQL:
Ver original
  1. DELETE FROM testaciones WHERE DescripEstacion='BAMARIS' AND CodEstacion='AM10' AND CodRegion='REAM'

- Y me da el siguiente error: #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`mttoaero`.`tequiposseriales`, CONSTRAINT `FK_TEquiposSeriales_TUbicacion` FOREIGN KEY (`CodRegion`, `CodEstacion`, `CodUbic`) REFERENCES `tubicacion` (`CodRegion`, `CodEstacion`, `CodUbic`) O).

- Investigando un poco pues creo que la razon del error se debe a una restricción de clave foranea dado que la PK tabla donde estoy tratando de hacer la operación DELETE está siendo usada en otra tabla como FK, y lo que estoy intentando hacer está afectando una PK que está en un registro de la segunda tabla y eso produce una violación de integridad referencial. Menudo problema para MI ya que por poco repruebo BD así que no se como resolver este problema.

- Sin embargo creo que a mi entender tengo que no solo eliminar el registro de testaciones si no tambien en tequiposseriales y tubicacion donde las FK esten afectando.

-Ok, ahora pregunto, ¿ Si es correcto lo que pienso como es posible realizar ese DELETE?, porque en mi ignorancia intente hacer esto:

Código SQL:
Ver original
  1. DELETE FROM testaciones, tequiposseriales, tubicacion WHERE AND CodEstacion='AM10' AND CodRegion='REAM'

- Y no resulto, o la solucion es otra??. Saludos...

Última edición por gnzsoloyo; 21/01/2015 a las 09:27
  #2 (permalink)  
Antiguo 21/01/2015, 09:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FK - Problema al tratar de eliminar registro.

Cita:
- Sin embargo creo que a mi entender tengo que no solo eliminar el registro de testaciones si no tambien en tequiposseriales y tubicacion donde las FK esten afectando.
Exactamente: Se deben borrar desde los hijos al padre, es decir en el orden inverso al que se insertaron.
Cita:
-Ok, ahora pregunto, ¿ Si es correcto lo que pienso como es posible realizar ese DELETE?, porque en mi ignorancia intente hacer esto:

Código SQL:

Ver original

Código MySQL:
Ver original
  1. DELETE FROM testaciones, tequiposseriales, tubicacion WHERE AND CodEstacion='AM10' AND CodRegion='REAM'


- Y no resulto, o la solucion es otra??. Saludos...
No te funciona porque MySQL no "mira" la dependencia de las tablas para hacerlo, sino que evalua otras cosas, y el resultado puede no ejecutarse en el orden adecuado.
No importa cuál es la lógica, simplemente debes tener en cuenta que no puedes presumir que respetará el orden que pones.

¿La solución?

Simple: Un DELETE específico para cada tabla, en el orden de dependencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/01/2015, 09:47
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: FK - Problema al tratar de eliminar registro.

Hola slikp:

Antes que nada, una consideraciones sobre este foro para tus futuros post's: todo el código de programación (de cualquier lenguaje) está prohibido, ojo con eso. Debes limitarte sólo a código SQL o lenguaje propio de MySQL...

Cuando pones código de algún otro lenguaje, te expones a que los moderadores editen tu post, eliminen el contenido y tu post quede incompleto y sin poder leerse, y en el peor de los casos, pueden incluso borrar tu pregunta, ojo con eso.

Ahora sí, volviendo al tema que te ocupa, efectivamente, la cuestión por la que no puedes borrar es justamente por cuestiones te integridad referencial, es decir llaves foraneas.

Esta es una de las principales características que debe tener una BD's bien diseñada... una BD's sin integridad referencial es simplemente un montón de basura

Tal como lo infieres correctamente, cuando quieres borrar un registro que hace referencia a otra tabla, lo primero que debes hacer es borrar toda la información de las tablas referenciadas y después, en un segundo "momento" borrar ahora si el registro que te interesa.

en tu caso, tienes varios problemas en tu última sentencia:

Código:
DELETE FROM testaciones, tequiposseriales, tubicacion WHERE AND CodEstacion='AM10' AND CodRegion='REAM'
De entrada tienes un HORROR (no error) de SINTAXIS, después del WHERE no puedes colocar un AND. Después, los campos que están en el WHERE ¿a qué tabla pertenecen? puedo suponer que alguno de ellos pueda estar en más de una tabla, por lo tanto, si no especificas a cuál pertenece tendrás un error de ambigüedad, ¿tercero, cómo están relacionadas tus tablas? tal como lo pones estás realizando un producto cartesiano, lo que eliminaría muchísimos registros que no necesariamente cumplan con la condición de filtrado.

Ahora bien... tienes dos formas de hacer la eliminación... una como te comenté, es eliminar primero las tablas relacionadas o "hijas" y después las tabla "padre", es decir, hacer tres DELETE's

Código:
DELETE FROM testaciones WHERE ...
DELETE FROM tequiposseriales WHERE ...
DELETE FROM tubicacion WHERE ...
Ojo, debes tener ojo en el orden de las eliminaciones... SIEMPRE DEBERAN IR LAS TABLAS HIJAS PRIMERO Y LA TABLA PADRE AL FINAL. Debes cuidar en cada condición WHERE colocar los filtros necesarios.

Otra alternativa sería tratar de eliminar todos los registros de todas la tablas a la vez... Esto puedes hacerlo de dos maneras, CUIDANDO SIEMPRE LA SINTAXIS:

Código:
DELETE t1,t2,t3 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id AND...

O

DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id AND...
Observa en este caso que en el WHERE en primer lugar DEBES PONER LOS JOIN'S EXPLICITOS que relacionan tus tablas, y al final las condiciones particulares para filtrar los registros que quieres eliminar.

En lo particular no recomiendo esta forma de eliminación, pues si omites alguna relación entre tus tablas (es decir no haces correctamente los JOIN's), se puede producir un producto cartesiano que implicaría que elimines registros que no debes.

Finalmente, te sugiero leer el tema de TRANSACCIONES... siempre que tengas que hacer más de una operación en la BD's, debes asegurarte que todo salga bien o de lo contrario deshacer los cambios para evitar inconsistencias.

Saludos
Leo.

EDITADO: Como siempre gnzsoloyo un paso adelante :P
Saludos
  #4 (permalink)  
Antiguo 21/01/2015, 10:02
 
Fecha de Ingreso: marzo-2013
Mensajes: 32
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: FK - Problema al tratar de eliminar registro.

- Gracias gnzsoloyo, tengo dos dudas a las cuales creo que solo me responderas a una :/ ... La primera es como puedo saber el orden de dependencia?.

- Y la segunda que creo que no me responderas porque vi que eliminaron parte de mi codigo dado que tiene que ver mas con programacion pero igual tocar la puerta no es pasar. en mi funcion para eliminar como ejecuto mas de un DELETE simultaneamente??.

EDITO:

- Gracias por la sugerencia leonardo_josue, Bueno en realidad se que después de un Where no va un AND eso fue Error o Descuido mio no me percate de eso y como de una no me resulto no le tome importancia a la sintaxis. Por otro lado no se bien como esta estructurada la BD y es mas o menos grande tiene al rededor de 34 tablas. Existe alguna forma de saber cuales son las tablas Hijas que dependan de un Padre ?? O tengo que ponerme a inspeccionar tabla por tabla??. Quisiera proporcionarles mas informacion sobre la estructura de la bd pero no se por donde empezar y me parece una groceria ponerle el SQL las 34 tablas si no es que hay más (fue un conteo rapido)...

Última edición por slikp; 21/01/2015 a las 10:17
  #5 (permalink)  
Antiguo 21/01/2015, 10:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FK - Problema al tratar de eliminar registro.

Cita:
en mi funcion para eliminar como ejecuto mas de un DELETE simultaneamente??.
Programáticamente, la respuesta sería: No es en simultáneo, sino secuencialmente. Uno detrás de otro, y en el orden correcto

Respecto a las dependencias, bueno, si TU las creaste, TU las conoces. De lo contrario hay varias soluciones:
1) Generar el diagrama de la base de datos por medio de ingeniería inversa, a través de alguna herramienta, como por ejemplo MySQL Workbench (recomedable). Alli se genrarán los gráficos indicando las relaciones de dependencia claramente.
2) Analizar cada tabla de la base, el CREATE TABLE de cada una (ver SHOW CREATE TABLE en el manual de referencia). Con eso puedes ir analizando una una las relaciones.
3) Analizar las dependencias en la base information_schema (solo para expertos), donde puedes ver la definicion de las constraint que existan y su tipo.

Yo sugiero la primera. es algo compleja, pero más facil que las otras.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 21/01/2015, 10:27
 
Fecha de Ingreso: marzo-2013
Mensajes: 32
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: FK - Problema al tratar de eliminar registro.

-gnzsoloyo, no las cree por lo tanto no las conosco como dije en mi primer post (BD ya previamente estructurada por el Profesor), el nos dio la BD ya echa para trabajar sobre ella. Bueno tendre que ponerme con lo que sugieres... Muchas gracias.
  #7 (permalink)  
Antiguo 21/01/2015, 10:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FK - Problema al tratar de eliminar registro.

Fijate si puedes usar el MySQL Workbench, que puedes descargar de la web oficial de MySQL.

Lleva algo de tiempo dominarlo, pero es nativo, por lo que es algo mas poderoso que otras cosas
__________________
¿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: campo, php, registro, select, sql, tabla, update
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 00:22.