2009-10-30 64 views
3

我剛剛在我的Rails應用程序中發現了一個錯誤,它會導致某些記錄沒有被刪除並且沒有與它們關聯的對象。該錯誤已得到解決,但我現在有數千個記錄在我的數據庫中,外鍵值指向不存在的記錄。SQL:刪除具有無效外鍵的記錄

是否可以刪除表中的所有記錄,其中整數外鍵引用另一個表中不存在於SQL中的記錄?怎麼樣?

回答

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

下一步當然是要立即創建一個外鍵約束(除非你是在MySQL的MyISAM在這種情況下,你的運氣了上)。

+0

謝謝,工作迅速有效。 – igul222 2009-10-30 21:50:45

+0

剛剛救了我的後腿,謝謝。 – 2013-01-16 00:23:50

1

從ChildTable刪除其中ForeignKeyField沒有(從ParentTable選擇PrimaryKeyField)

0

是 - 使用使用 複合語句 「WHERE山坳不是(從FKTABLE selecy ID)」

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

我不不知道是否有一個簡單的方法。但是你可以寫一個處理它的腳本。假設你的模型是這樣的

 
class Post 
belongs_to :user 
end 

在這裏,你可以使用這樣的腳本

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

那麼它更容易和straigtforward編寫SQL。但是這次在嘗試做魔法之前先進行數據庫轉儲

+0

這是我最初的嘗試,但是我們有太多的記錄 - 它需要幾天才能完成。 – igul222 2009-10-30 21:50:15

2

是的,有幾種方法可以刪除所有舊的行。假設您有一個名爲users的表,其中id列和一個名爲posts的表和user_id列應引用現有用戶。您可以刪除不存在的用戶的所有帖子與此查詢:

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

這已經張貼Damir Sudarevic之前。它比zzzeek的答案更容易,更快速。

刪除所有違規行後,您可以創建外鍵。這將防止這種情況發生。