Обработка целостности базы данных - PullRequest
7 голосов
/ 22 января 2011

Я представляю целостность базы данных с помощью ограничений innodb в следующей версии моего приложения.Все идет хорошо, но в некоторых из моих таблиц есть записи с удаленными ссылками (мертвые записи), и из-за них я не могу добавить ограничения в таблицу.

Я пытаюсь:

ALTER TABLE `article` ADD FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE;

И я получаю:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`books`.<result 2 when explaining filename '#sql-442_dc'>, CONSTRAINT `#sql-442_dc_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE)

Запустив этот запрос, я обнаружил, что более 500 записей не имеют ссылок (авторы были удалены, но их статьи остались):

SELECT `articles`.`id`
FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id`
WHERE ISNULL(`authors`.`id`);

Итак,прежде чем я могу добавить ограничение, я должен разобраться с ними. Как удалить все записи, которые я получаю, используя запрос выше?

Я пытался:

DELETE FROM `articles` WHERE `id` IN (
  SELECT `articles`.`id`
  FROM `articles` LEFT JOIN `authors` ON `articles`.`author_id` = `authors`.`id`
  WHERE ISNULL(`authors`.`id`);
)

Но mysql отвечает:

You can't specify target table 'articles' for update in FROM clause

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

14 голосов
/ 22 января 2011

Я не слишком знаком со многими причудами mySql, но это также должно работать, и, возможно, mySql не захлебнется:

delete from articles
 where not exists (
           select id from authors
            where authors.id = articles.author_id
       )

Хм, конечно, у нас всегда есть резервная копиятаблица, прежде чем мы попытаемся удалить на основе множеств:)

...