[MySQL]: eliminar las filas de dos tablas dependientes
-
19-09-2019 - |
Pregunta
Estoy tratando de eliminar todas las filas de dos tablas dependientes basado en una tercera Identificación tablas.
Estructura de la tabla:
Transaction
-Transaction_ID (primary)
-Timestamp
Purchase
-Item_ID
-Transaction_ID
-Purchase_ID (primary)
Item
-Item_ID (primary)
-Client_ID
Me gustaría eliminar todas las filas de la transacción / compra que coinciden con el client_id en el punto. Suena bastante simple ... Incluso puedo 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
No ...
Me sale este error foreign key constraint fails...
- Estoy seguro que muchos de ustedes no se sorprende
¿Es el tema que la compra utiliza t.Transaction_ID -? (Por lo tanto, esta clave externa fallaría)
O ¿hay otros datos dependientes t.Transaction_ID probables en esta tabla (i no he encontrado ninguna).
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)
Solución
No se pueden eliminar de una tabla, siempre y cuando todavía existen registros dependientes de otra tabla. En su caso, la dependencia es la siguiente
Transaction <- Purchase -> Item
Así que hay que eliminar cualquier compra antes de poder eliminar las transacciones.
Como alternativa a este enfoque de dos pasos, yo recomendaría la creación de un ON DELETE CASCADE
restricción 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 una Item
dependiente con un Client_ID
juego, independientemente de si hay algún otro Los productos en él. Si esto no es lo que quiere, la pregunta necesita ser refinado.
Otros consejos
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 se puede utilizar ON DELETE CASCADE en sus llaves extranjeras, parece que está utilizando ON DELETE RESTRINJA .
Vea 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: el error cometido 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