[英]How can you check for foreign key references for a list of records before attempting to delete any of these records in MySQL?
當您有記錄列表時,有沒有辦法在嘗試刪除這些記錄中的任何一個之前檢查其中每個記錄是否都具有外鍵引用?
例如,如果我有一個借閱者列表和一本賬簿,那么如果借閱者仍然有借書的話,那么您就不能從系統中刪除該借閱者。 (但是,我的實際系統要比這復雜得多-表格要多得多。)
我想從所有有借書的借款人中刪除刪除選項(在該示例中)。
如果我嘗試刪除帶有外鍵引用的記錄,則會收到以下錯誤:
數據庫訪問失敗:不能刪除或更新父行,外鍵約束失敗(
dbname
。tablename
,約束fkfieldid
外鍵(fieldid
)參考tablename
(fieldid
))
一種解決方案是編寫查詢,以檢查記錄列表中的每個記錄是否在可以引用的任何可能表中具有任何外鍵引用。
但是,如果我希望在內容管理系統中顯示一個表中的100條記錄的列表,並且我必須運行100個子查詢才能顯示該列表,那么顯然效率很低!
最終用戶在嘗試刪除記錄時會感到困惑,但由於在其他地方“正在使用”該數據而無法做到這一點,因此我寧願刪除該選項以免造成混亂。
關於什么是最好的事情的任何想法? 謝謝。
您可以使用子查詢或聯接輕松地執行此操作。
即。 子查詢
SELECT B.*, (SELECT COUNT(*) FROM loans L WHERE L.book_id = b.id) loan_count
FROM books B
或加入(請注意,如果您允許同時進行多次借貸,則該書在結果中會出現多次):
SELECT B.*, L.book_id AS loaned_out_if_not_null
FROM books B
LEFT JOIN loans L ON B.id = L.book_id
當然可以使用GROUP BY來縮短:
SELECT B.id, B.name, COUNT(L.book_id) AS loan_count
FROM books B
LEFT JOIN loans L ON B.id = L.book_id
GROUP BY B.id, B.name
如果您的數據庫引擎支持CASE,則可以通過將其與DISTINCT結合使用來避免結果中出現多行(當然,DISTINCT也有開銷):
SELECT DISTINCT B.*,
CASE WHEN L.book_id IS NOT NULL THEN 1 ELSE 0 END AS loaned_out_if_one
FROM books B
LEFT JOIN loans L ON B.id = L.book_id
其中,我將使用GROUP BY變體。
您可能喜歡的是交易。
1)刪除所有條目。
2a)如果發生任何錯誤->回滾2b)如果沒有發生錯誤->提交
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.