处理数据库完整性

时间:2011-01-22 19:25:01

标签: mysql foreign-keys innodb mysql-error-1093 mysql-error-1452

我在我的应用程序的下一个版本中使用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 个答案:

答案 0 :(得分:14)

我不太熟悉mySql的许多怪癖,但这也应该有用,也许mySql不会呛到它:

delete from articles
 where not exists (
           select id from authors
            where authors.id = articles.author_id
       )
嗯,当然我们在尝试基于集合的删除之前总是有一个表的备份:)