問題:
有表A,和表B、表C、表D
表B 表C 表D參考了表A中的記錄ID(未設定外鍵約束)
在洗掉表A中的記錄時,如何判斷記錄是否被表B 或表C 或表D參考,如果參考了,則不允許洗掉。
方法:在洗掉表A中的記錄時,依次查詢表B、表C、表D是否存在表A記錄的ID,如果存在,則不允許洗掉
缺點一:如果后期又添加了對表A中記錄有參考的表時,還要修改代碼或SQL
缺點二:如果有很多對表參考表A記錄時,要查詢很多表,浪費性能。
請問是否有其他更好的解決方法?
uj5u.com熱心網友回復:
你A表多加幾列,代表其他表是否有次id記錄比如叫LockB,LockC,LockD值為0|1
當b表插入對應值時LockB賦值1,以此類推
當A表刪資料時,判斷這幾列是否都為0即可
uj5u.com熱心網友回復:
這就是資料庫為什么需要外鍵約束。1. 外鍵約束就是為了防止這種不完整的資料產生;
2. 外鍵加上索引就是為了提高性能。
事情總得有人做,資料庫不做應用就得做,應用做就得改代碼。還有一個問題,當你洗掉 A 資料時,查詢其他表沒有參考資料;代碼開始洗掉,這時候正好有人插入了一個 B 表資料,參考了 A 中洗掉的資料。
所以說,你不用資料庫約束就得自己保證完整性;或者能夠容忍暫時不完整,后臺定時清理資料。
uj5u.com熱心網友回復:
給你舉一個例子哈,中國過去有一個大學,叫白求恩醫科大學,這個學校已經被合并到吉林大學了。我們現在的系統里,有一個表,存盤了中國所有大學的名稱。
現在的需求是,在高中生選擇可以報考的大學時,不能選擇白求恩醫科大學。
但是,之前某位已經畢業于白求恩醫科大學的醫生(ta畢業時,白求恩醫科大學還沒有被吉林大學合并。),ta的畢業院校還要顯示白求恩醫科大學。
解決這個問題的思路是,在存盤中國所有大學的名稱的表里,增加欄位,標識這個學校是否仍然存在。
在高中生選擇可以報考的大學時,顯示所有仍然存在的學校。
在顯示那位已經畢業醫生的畢業院校時,不考慮學校是否存在。
以上,是我覺得解決您問題的思路。
通常成熟的系統,不會考慮直接的物理洗掉,而是通過標志位,實作邏輯洗掉。
即使您一定要洗掉不用的陳述句,也是必須要配置表和欄位的對應關系才可以,不能系統自己判斷。
假如,A表有欄位A1,這個欄位存在值為123的資料。B表有欄位B1和B2,如果A表好B表有關聯,而B表的B1和B2欄位都存在不規則的123值,這樣系統就無法判斷B1和B2哪個欄位是用來和A1關聯的。
最后,不建議用外鍵,開始設計的時候很高大上,后期能折磨死人,隨意百度一下關于外鍵引發的問題,就知道外鍵引發的問題有多糟糕了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/30019.html
標籤:MySQL
上一篇:SQL SERVER安裝
