如何在另一个表中缺少值后清理表?

时间:2011-06-19 03:30:50

标签: mysql sql wordpress join bbpress

我尝试将bbPress 1.0安装程序迁移到我的WordPress上的新bbPress 2.0插件时失败了,这在我的wp_posts表上造成了很大的混乱。

我解决了这一问题,删除了将topicreply值添加到post_type列的所有帖子,这很好。

但现在我注意到wp_postmeta似乎受到很多条目的影响,这些条目引用了我删除的帖子。两个表都有post_id列。

问题是:我使用哪个SQL命令来删除wp_postmeta引用wp_posts上不再存在的行的值?我知道这是我应该使用的某种联接,但我不知道如何寻找不存在的东西并将其删除。

PS:WordPress表没有保持参照完整性的原因是什么?我很确定在删除wp_postmeta上的相关内容时,可以从wp_posts自动删除某些内容。哦,好吧......

2 个答案:

答案 0 :(得分:0)

手动删除表a中与表b中没有匹配的行的一般方法是:

DELETE FROM table_a WHERE some_id NOT IN (SELECT some_id FROM table_b);

这可能不是最有效的批量删除方式(连接可能更快),但我通常更喜欢这样的情况下的子选择,它更容易理解,因此降低了FUBAR概率(你不要我不想意外删除table_b等中的行。

所以在你的情况下,你可能会做这样的事情:

SELECT * FROM wp_postmeta WHERE post_id NOT IN (SELECT post_id FROM wp_posts);

如果您确定,这些是您要删除的行,请将SELECT *替换为DELETE:

DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT post_id FROM wp_posts);

答案 1 :(得分:-1)

  

我知道这是我应该使用的某种联接,但我不知道如何寻找不存在的东西并将其删除。

是的,您想使用外连接。

  

PS:WordPress表没有保持参照完整性的原因是什么?

许多较新的应用程序现在使用实体框架,并没有明确强制引用完整性,只是关系。例如,Atlassian JIRA不强制执行参照完整性。