【问题标题】:How to clean a table after values missing from another table?如何在另一个表中缺少值后清理表?
【发布时间】:2011-09-18 00:35:42
【问题描述】:

我尝试将 bbPress 1.0 安装迁移到我的 WordPress 上的新 bbPress 2.0 插件没有成功,这在我的wp_posts 表上弄得一团糟。

我通过删除所有带有 topicreply 值到 post_type 列的帖子来解决这个问题,这很好。

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

问题是:我使用哪个 SQL 命令删除 wp_postmeta 上的值,这些值引用了 wp_posts 上不再存在的行?我知道这是我应该使用的某种联接,但我不明白寻找不存在的东西并删除它会怎样。

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

【问题讨论】:

    标签: mysql sql wordpress join bbpress


    【解决方案1】:

    从表 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);
    

    【讨论】:

    • 谢谢。它进行了一些修改。原来wp_posts 有一个id 列而不是post_id 列。我在删除命令中添加了low_priority 以保持其进程友好。它使一个 17MB 的表变成了一个新的 500KB 的表。 :)
    【解决方案2】:

    我知道这是我应该使用的某种联接,但我不明白寻找不存在的东西并删除它会怎样。

    是的,您想使用外连接。

    PS:WordPress 表没有保持参照完整性是怎么回事?

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

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多