Ver Mensaje Individual
  #3 (permalink)  
Antiguo 21/01/2015, 09:47
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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