una tablas relacionadas registros registro llave inner hacer foranea eliminar diferentes delete consultas consultar consulta con como cascada borrar mysql sql delete-row sql-delete mysql-error-1093

mysql - tablas - eliminar registros con llave foranea



SQL DELETE con JOIN en otra tabla para la condiciĆ³n WHERE (4)

Tengo que eliminar filas de guide_category que no tienen relación con la tabla de guide (relaciones muertas).

Esto es lo que quiero hacer, pero por supuesto no funciona.

DELETE FROM guide_category AS pgc WHERE pgc.id_guide_category IN (SELECT id_guide_category FROM guide_category AS gc LEFT JOIN guide AS g ON g.id_guide = gc.id_guide WHERE g.title IS NULL)

Error:

No se puede especificar la tabla de destino ''guide_category'' para la actualización en la cláusula FROM


Creo que, según su descripción, lo siguiente sería suficiente:

DELETE FROM guide_category WHERE id_guide NOT IN (SELECT id_guide FROM guide)

Supongo que no hay restricciones de integridad referencial en las tablas involucradas, ¿verdad?


Debido a los problemas de implementación de bloqueo, MySQL no permite hacer referencia a la tabla afectada con DELETE o UPDATE .

Necesitas hacer un JOIN aquí en su lugar:

DELETE gc.* FROM guide_category AS gc LEFT JOIN guide AS g ON g.id_guide = gc.id_guide WHERE g.title IS NULL

o simplemente usa un NOT IN :

DELETE FROM guide_category AS gc WHERE id_guide NOT IN ( SELECT id_guide FROM guide )


Pruebe este ejemplo de scripts SQL para una fácil comprensión,

CREATE TABLE TABLE1 (REFNO VARCHAR(10)) CREATE TABLE TABLE2 (REFNO VARCHAR(10)) --TRUNCATE TABLE TABLE1 --TRUNCATE TABLE TABLE2 INSERT INTO TABLE1 SELECT ''TEST_NAME'' INSERT INTO TABLE1 SELECT ''KUMAR'' INSERT INTO TABLE1 SELECT ''SIVA'' INSERT INTO TABLE1 SELECT ''SUSHANT'' INSERT INTO TABLE2 SELECT ''KUMAR'' INSERT INTO TABLE2 SELECT ''SIVA'' INSERT INTO TABLE2 SELECT ''SUSHANT'' SELECT * FROM TABLE1 SELECT * FROM TABLE2 DELETE T1 FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.REFNO = T2.REFNO

Tu caso es:

DELETE pgc FROM guide_category pgc LEFT JOIN guide g ON g.id_guide = gc.id_guide WHERE g.id_guide IS NULL


Qué tal si:

DELETE guide_category WHERE id_guide_category IN ( SELECT id_guide_category FROM guide_category AS gc LEFT JOIN guide AS g ON g.id_guide = gc.id_guide WHERE g.title IS NULL )