2010-01-06 17 views
5

Estoy intentando eliminar todas las filas en dos tablas dependientes basadas en una tercera ID de tablas.[MySQL]: ELIMINAR filas de dos tablas dependientes

Estructura de tabla:

Transaction 
-Transaction_ID (primary) 
-Timestamp 

Purchase 
-Item_ID 
-Transaction_ID 
-Purchase_ID (primary) 

Item 
-Item_ID (primary) 
-Client_ID 

quisiera eliminar todas las filas de la transacción/compra que coinciden con el client_id en el punto. Suena bastante simple ... Incluso puede envolver mi mente alrededor de ese novato ...

DELETE dbName.t FROM 
    dbName.Transaction t 
JOIN 
    dbName.Purchase p 
ON 
    p.Transaction_ID = t.Transaction_ID 
JOIN 
    dbName.Item i 
ON 
    p.Item_ID = i.Item_ID 
WHERE 
    Client_ID = 1 

Nop ...

me sale este error foreign key constraint fails... - Estoy seguro que muchos de ustedes no está sorprendido.

¿El problema es que Compra usa t.Transaction_ID? - (por lo tanto, esta clave externa fallaría)

O es probable que existan otros datos dependientes de T.Transaction_ID en esta tabla (no he encontrado ninguno).

EDIT: COMPLETE ERROR

Cannot delete or update a parent row: a foreign key constraint fails 
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction` 
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`) 
ON DELETE NO ACTION ON UPDATE CASCADE) 

Respuesta

4

No puede eliminar de una tabla mientras existan registros dependientes en otra tabla. En su caso, la dependencia es la siguiente

Transaction <- Purchase -> Item 

Por lo tanto, debe eliminar las compras antes de poder eliminar las transacciones.

Como alternativa a este enfoque de dos pasos, recomendaría la creación de un ON DELETE CASCADE constraint e ir con esto:

DELETE 
    Transaction 
WHERE 
    Transaction_ID IN (
    SELECT 
     Transaction_ID 
    FROM 
     Purchase INNER JOIN Item ON Item.Item_ID = Purchase.Item_ID 
    WHERE 
     Item.Client_ID = <your Client ID here> 
) 

Tenga en cuenta que esto elimina cualquier Transaction (y, a través de CASCADE, cualquier Purchase) donde hay es un dependiente Item con un Client_ID correspondiente, independientemente de si hay otros artículos en él. Si esto no es lo que quieres, la pregunta debe ser refinada.

+0

para mí parece lo opuesto: la transacción depende de la compra (como no puedo eliminar por client_id sin ella) –

+0

@Derek Adair: ya que @AlbertEin fue el primero en responder la pregunta correctamente, y mi publicación necesitaba una revisión general. antes de que fuera útil, considere aceptar su respuesta. – Tomalak

+0

Sin mirar detenidamente, tiene un Transaction_ID dentro de su tabla de compras. Si eliminó la transacción primero, la tabla de compras contendría temporalmente una Transaction_ID no válida que no existía. – MindStalker

2
Transaction <- Purchase -> Item 

Su problema es que usted está tratando de eliminar la transacción antes de eliminar la compra, la forma correcta de hacerlo es eliminar la compra y sólo entonces la transacción, que , o puede usar AL ELIMINAR CASCADA en sus claves externas, parece que está utilizando ON DELETE RESTRICT.

Ver aquí: http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html

Además, si quieres probar para asegurarse de que es la razón por la que debe dar el error completo, el DBMS por lo general le dice qué violación de clave externa está levantando el error.

ACTUALIZACIÓN: su error dejó en claro, el problema es que va a eliminar la compra primero y luego la transacción, lo que necesita hacer al revés o conjunto ON DELETE CASCADE en su restricción de clave externa

+0

Los comentarios debajo de mi respuesta ahora son un farol. ¿Deberíamos eliminarlos? – Tomalak

+0

No hay ningún problema para mí. Por lo tanto, si los eliminas los eliminaré también;) – albertein

+0

Bien, eliminando ahora. Voy a publicar una recomendación para su respuesta cuando terminemos, ya que lo entendió justo antes que yo. – Tomalak

Cuestiones relacionadas