Ну, единственный случай, когда этот код:
DELETE FROM wagtailcore_pagerevision
WHERE id NOT IN (SELECT live_revision_id FROM wagtailcore_page);
не будет работать, это если в столбце live_revision_id
в таблице wagtailcore_page
есть значения null
.Поскольку, если есть нулевые значения, они включаются в результат подзапроса:
SELECT live_revision_id FROM wagtailcore_page
, поэтому для каждого id
из wagtailcore_pagerevision
, не существующего в результатах подзапроса, это:
IN (SELECT live_revision_id FROM wagtailcore_page)
возвращает null
, поскольку оно сравнивается (также) с null
, а NOT IN
наконец возвращает null
, что означает неизвестный или неопределенный , какой изКонечно, не TRUE
.Из Функции и операторы сравнения (для MySQL, но это относится и к SQLite, так как это стандарт SQL):
Чтобы соответствовать стандарту SQL, IN возвращает NULL не только есливыражение в левой части равно NULL, но также если совпадение не найдено в списке и одно из выражений в списке равно NULL.
См. демо .Таким образом, решение вашей проблемы было бы:
DELETE FROM wagtailcore_pagerevision
WHERE id NOT IN (
SELECT live_revision_id
FROM wagtailcore_page
WHERE live_revision_id IS NOT NULL
);
См. demo .