Je dois supprimer des lignes de guide_category
qui n’a aucune relation avec guide
table (relations mortes).
Voici ce que je veux faire, mais cela ne fonctionne bien sûr pas.
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)
Erreur:
Vous ne pouvez pas spécifier la table cible 'guide_category' pour la mise à jour dans la clause FROM
En raison des problèmes d'implémentation de verrouillage, MySQL
ne permet pas de référencer la table affectée avec DELETE
ou UPDATE
.
Vous devez faire un JOIN
ici à la place:
DELETE gc.*
FROM guide_category AS gc
LEFT JOIN
guide AS g
ON g.id_guide = gc.id_guide
WHERE g.title IS NULL
ou utilisez simplement un NOT IN
:
DELETE
FROM guide_category AS gc
WHERE id_guide NOT IN
(
SELECT id_guide
FROM guide
)
Je pense, d'après votre description, ce qui suit suffirait:
DELETE FROM guide_category
WHERE id_guide NOT IN (SELECT id_guide FROM guide)
Je suppose qu'il n'y a pas de contraintes d'intégrité référentielle sur les tables impliquées, n'est-ce pas?
Essayez cet exemple de scripts SQL pour faciliter la compréhension.
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
Votre cas est:
DELETE pgc
FROM guide_category pgc
LEFT JOIN guide g
ON g.id_guide = gc.id_guide
WHERE g.id_guide IS NULL