我剛剛在我的Rails應用程序中發現了一個錯誤,它會導致某些記錄沒有被刪除並且沒有與它們關聯的對象。該錯誤已得到解決,但我現在有數千個記錄在我的數據庫中,外鍵值指向不存在的記錄。SQL:刪除具有無效外鍵的記錄
是否可以刪除表中的所有記錄,其中整數外鍵引用另一個表中不存在於SQL中的記錄?怎麼樣?
我剛剛在我的Rails應用程序中發現了一個錯誤,它會導致某些記錄沒有被刪除並且沒有與它們關聯的對象。該錯誤已得到解決,但我現在有數千個記錄在我的數據庫中,外鍵值指向不存在的記錄。SQL:刪除具有無效外鍵的記錄
是否可以刪除表中的所有記錄,其中整數外鍵引用另一個表中不存在於SQL中的記錄?怎麼樣?
delete from child_table where not exists
(select 1 from parent_table where parent_table.id=child_table.related_id)
下一步當然是要立即創建一個外鍵約束(除非你是在MySQL的MyISAM在這種情況下,你的運氣了上)。
從ChildTable刪除其中ForeignKeyField沒有(從ParentTable選擇PrimaryKeyField)
是 - 使用使用 複合語句 「WHERE山坳不是(從FKTABLE selecy ID)」
DELETE FROM tblPerson
WHERE DepartmentID NOT IN (SELECT ID FROM tblDepartment)
我不不知道是否有一個簡單的方法。但是你可以寫一個處理它的腳本。假設你的模型是這樣的
class Post belongs_to :user end
在這裏,你可以使用這樣的腳本
Post.all.each do |post| post.delete if post.user.nil? end
那麼它更容易和straigtforward編寫SQL。但是這次在嘗試做魔法之前先進行數據庫轉儲
這是我最初的嘗試,但是我們有太多的記錄 - 它需要幾天才能完成。 – igul222 2009-10-30 21:50:15
是的,有幾種方法可以刪除所有舊的行。假設您有一個名爲users
的表,其中id
列和一個名爲posts
的表和user_id
列應引用現有用戶。您可以刪除不存在的用戶的所有帖子與此查詢:
DELETE FROM posts WHERE user_id NOT IN (SELECT id FROM users);
這已經張貼Damir Sudarevic之前。它比zzzeek的答案更容易,更快速。
刪除所有違規行後,您可以創建外鍵。這將防止這種情況發生。
謝謝,工作迅速有效。 – igul222 2009-10-30 21:50:45
剛剛救了我的後腿,謝謝。 – 2013-01-16 00:23:50