那麼,SELECT
查詢不會刪除任何東西,所以這是錯誤的原因。
我想試試這個:
DELETE c FROM child AS c
LEFT OUTER JOIN parent AS w1 ON c.child_id = w1.a_child_id
LEFT OUTER JOIN parent AS w2 ON c.child_id = w2.b_child_id
WHERE w1.a_child_id IS NULL AND w2.b_child_id IS NULL;
它可能看起來很奇怪加入到父表的兩倍,但它可能會利用指標更好的(假設你有a_child_id和b_child_id索引)。
您應該使用EXPLAIN驗證優化計劃。轉換刪除一個SELECT並得到優化方案:
mysql> explain select c.child_id from child c
left outer join parent w1 on c.child_id = w1.a_child_id
left outer join parent w2 on c.child_id = w2.b_child_id
where w1.a_child_id is null and w2.b_child_id is null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: c
type: index
possible_keys: NULL
key: PRIMARY
key_len: 8
ref: NULL
rows: 5
Extra: Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: w1
type: ref
possible_keys: ac
key: ac
key_len: 9
ref: test.c.child_id
rows: 1
Extra: Using where; Using index
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: w2
type: ref
possible_keys: bc
key: bc
key_len: 9
ref: test.c.child_id
rows: 1
Extra: Using where; Using index
當它說:「使用索引」這意味着它能夠通過使用僅索引來解決表的訪問,而不需要讀取錶行。
我用MySQL 5.5.12測試了上面的內容,從你的描述中猜測你的表結構。我在每個a_child_id和b_child_id上創建了一個單列索引。
我沒有在表child中定義的a_child_id或b_child_id,它們在表父項中定義並引用child。 – user157195