我刚刚在我的Rails应用程序中发现了一个错误,该错误会导致某些记录无法与其关联对象一起删除。该错误已得到修复,但我现在在我的数据库中有几千条记录,外键值指向不存在的记录。
是否可以删除表中的所有记录,其中整数外键引用SQL中不存在的另一个表中的记录?怎么样?
答案 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更容易和更直接。但是这次在尝试做魔术之前先进行数据库转储