gpt4 book ai didi

mysql - 使用左连接删除 MYSQL 中的孤儿

转载 作者:行者123 更新时间:2023-11-29 00:54:30 25 4
gpt4 key购买 nike

在 MYSQL 中,我有一个表 parent,它在表 child 中有 2 个外键(a_child_id 和 b_child_id)。我正在尝试删除孤儿(表 child 中与表 parent 无关的条目)

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 小时,我只是想确保查询是正确的?

最佳答案

嗯,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 验证优化计划。将 delete 转换为 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 创建了一个单列索引。

关于mysql - 使用左连接删除 MYSQL 中的孤儿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com