Ich muss Zeilen löschen guide_category
, die keine Beziehung zur guide
Tabelle haben (tote Beziehungen).
Folgendes möchte ich tun, aber es funktioniert natürlich nicht.
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:
Sie können die Zieltabelle 'guide_category' für die Aktualisierung in der FROM-Klausel nicht angeben
Antworten:
Ermöglicht aufgrund der Probleme bei der Sperrimplementierung
MySQL
keine Referenzierung der betroffenen Tabelle mitDELETE
oderUPDATE
.Sie müssen
JOIN
stattdessen hier ein machen :DELETE gc.* FROM guide_category AS gc LEFT JOIN guide AS g ON g.id_guide = gc.id_guide WHERE g.title IS NULL
oder verwenden Sie einfach ein
NOT IN
:DELETE FROM guide_category AS gc WHERE id_guide NOT IN ( SELECT id_guide FROM guide )
quelle
DELETE gc
anstelle vonDELETE gc.*
DELETE gc
anstelle vongc.*
LEFT JOIN
mitIS NULL
schnell, dasNOT IN
ist langsam. Das war eine Postgres-Datenbank, auch wenn alle Indizes vorhanden waren.Ich denke, Ihrer Beschreibung nach würde Folgendes ausreichen:
DELETE FROM guide_category WHERE id_guide NOT IN (SELECT id_guide FROM guide)
Ich gehe davon aus, dass die beteiligten Tabellen keine Einschränkungen hinsichtlich der referenziellen Integrität aufweisen.
quelle
Probieren Sie diese SQL-Beispielskripte aus, um das Verständnis zu erleichtern.
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
Ihr Fall ist:
DELETE pgc FROM guide_category pgc LEFT JOIN guide g ON g.id_guide = gc.id_guide WHERE g.id_guide IS NULL
quelle
Wie wäre es mit:
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 )
quelle