使用左连接删除MYSQL中的孤立

时间:2011-07-20 00:54:10

标签: mysql join

在MYSQL中,我有表parent,表child中有2个外键(a_child_id和b_child_id)。我试图删除子孤儿(表子项中与表父级无关的条目)

select c.child_id from child c left join parent w on (w.a_child_id=c.child_id or 
w.b_child_id=c.child_id ) where w.parent_id is null

由于表格大小,上面的查询已经运行了24小时,我只是想确保查询正确吗?

2 个答案:

答案 0 :(得分:1)

好吧,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中创建了一个单列索引。

答案 1 :(得分:0)

这不会更容易吗?

delete from child
where a_child_id is null
and b_child_id is null;

或者你没有将这些定义为外键吗?