guide
テーブルとの関係がない(死んだ関係)guide_category
から行を削除する必要があります。
これが私がやりたいことですが、もちろんうまくいきません。
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)
エラー:
FROM句で更新するターゲットテーブル 'guide_category'を指定できません
ロックの実装の問題により、MySQL
は、DELETE
またはUPDATE
で影響を受けるテーブルを参照することを許可しません。
代わりに、ここでJOIN
を作成する必要があります。
DELETE gc.*
FROM guide_category AS gc
LEFT JOIN
guide AS g
ON g.id_guide = gc.id_guide
WHERE g.title IS NULL
または単にNOT IN
を使用します:
DELETE
FROM guide_category AS gc
WHERE id_guide NOT IN
(
SELECT id_guide
FROM guide
)
あなたの説明から、以下で十分だと思います:
DELETE FROM guide_category
WHERE id_guide NOT IN (SELECT id_guide FROM guide)
関係するテーブルに参照整合性制約がないと思いますか?
簡単に理解するには、このサンプルSQLスクリプトを試してください。
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
あなたのケースは:
DELETE pgc
FROM guide_category pgc
LEFT JOIN guide g
ON g.id_guide = gc.id_guide
WHERE g.id_guide IS NULL