SQL:删除包含无效外键的记录

时间:2009-10-30 21:30:53

标签: sql ruby-on-rails

我刚刚在我的Rails应用程序中发现了一个错误,该错误会导致某些记录无法与其关联对象一起删除。该错误已得到修复,但我现在在我的数据库中有几千条记录,外键值指向不存在的记录。

是否可以删除表中的所有记录,其中整数外键引用SQL中不存在的另一个表中的记录?怎么样?

6 个答案:

答案 0 :(得分:15)

delete from child_table where not exists 
   (select 1 from parent_table where parent_table.id=child_table.related_id)

下一步当然是立即创建一个FOREIGN KEY约束(除非你使用的是MySQL MyISAM,在这种情况下你运气不好)。

答案 1 :(得分:6)

DELETE FROM tblPerson
WHERE DepartmentID NOT IN (SELECT ID FROM tblDepartment)

答案 2 :(得分:2)

是的,有几种方法可以删除所有旧行。假设您有一个名为users的表格,其中包含id列和一个名为posts的表格,其中user_id列应引用现有用户。您可以使用此查询删除所有不存在用户的帖子:

DELETE FROM posts WHERE user_id NOT IN (SELECT id FROM users);

此前由Damir Sudarevic发布。它比zzzeek的答案更容易,更快。

删除所有违规行后,您可以创建外键。这样可以防止这种情况发生。

答案 3 :(得分:1)

从ChildTable中删除ForeignKeyField不在其中(从ParentTable中选择PrimaryKeyField)

答案 4 :(得分:0)

是 - 使用复合语句 “WHERE col in in(从F TABLE中选择id)”

答案 5 :(得分:0)

我不知道是否有直接的方式。但是你可以编写一个处理它的脚本。说你的模型是这样的

class Post 
 belongs_to :user
end

在这里,你可以使用这样的脚本

 Post.all.each do |post|
   post.delete if post.user.nil?
 end

然后编写SQL更容易和更直接。但是这次在尝试做魔术之前先进行数据库转储