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)
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top