Как очистить таблицу после пропущенных значений в другой таблице?

Я безуспешно пытался перенести установку bbPress 1.0 на новый плагин bbPress 2.0 на моем WordPress, что сильно испортило мой wp_posts Таблица.

Я решил это, удалив все сообщения, которые несут значения topic а также reply к post_type колонка, и это было хорошо.

Но теперь я заметил, что wp_postmeta Кажется, на меня влияет множество записей, ссылающихся на сообщения, которые я удалил. Обе таблицы имеют post_id колонка.

Вопрос в том, какую команду SQL я использую для удаления значений wp_postmeta ссылки на линии, которые больше не на wp_posts? Я знаю, что это какое-то соединение, которое я должен использовать, но я не понимаю, как было бы искать что-то, чего нет, и удалять его.

PS: А что случилось с таблицами WordPress, не сохраняющими ссылочную целостность? Я уверен, что можно автоматически удалить что-то из wp_postmeta при удалении чего-либо, связанного с wp_posts, Ну что ж…

2 ответа

Решение

Общий способ вручную удалить строки из таблицы 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);

Я знаю, что это какое-то соединение, которое я должен использовать, но я не понимаю, как было бы искать что-то, чего нет, и удалять его.

Да, вы хотите использовать внешние соединения.

PS: А что случилось с таблицами WordPress, не сохраняющими ссылочную целостность?

Многие новые приложения в настоящее время используют каркасы сущностей и явно не обеспечивают ссылочную целостность, а только отношения. Например, Atlassian JIRA не обеспечивает ссылочную целостность.

Другие вопросы по тегам