原地址: http://blog.sina.com.cn/s/blog_5e0ed6fd0100i1z2.html
?
??? 手動刪除數據庫中冗余數據可能遇到外鍵關聯導致數據無法刪除的問題。這個問題的解決及思考記錄如下:
?
?? 問題的產生是因為在數據庫設計的時候,在建立外鍵關聯的時候沒有設置級聯刪除,也就是說在設置外鍵的時候并沒有加上on delete cascade限定。對于這個問題,我的想法是:在數據庫設計的時候一般情況下都是應該加上這樣的限制的。如果說擔心“級聯刪除”可能會誤刪有用的數據,這種情況如果真的發生的話,那么就應該在數據庫的設計上找原因了。
??? 如果在數據庫設計的時候設置了級聯刪除,那么本文提到的問題是不會發生的。如果不幸這樣的狀況發生了,那么可以根據它提示的關聯外鍵,到user_constraints表中按constraint_name查找到唯一的記錄,當然查詢這個系統視圖的用戶權限應該比較高,然后在記錄中找到table_name,最后編輯表的外鍵關聯,將on delete觸發的動作改為cascade。如果數據庫中數據庫表很多,關聯關系比較復雜,那么很可能在遇到問題之后要修改的外鍵關聯時的級聯刪除不止一個兩個。
??? 此外,說兩個題外話:
??? 第一,設置外鍵關聯的時候,級聯操作有三種設置方式:
??? 默認無動作:on delete no action;
??? 置空:on delete set null;
??? 級聯刪除:on delete cascade。
??? 第二,在drop表的時候,用drop table cascade constraints語句,只會刪除子表與父表之間的關聯關系,不會刪除子表中關聯父表的那些記錄。
??? 如果在數據庫設計的時候設置了級聯刪除,那么本文提到的問題是不會發生的。如果不幸這樣的狀況發生了,那么可以根據它提示的關聯外鍵,到user_constraints表中按constraint_name查找到唯一的記錄,當然查詢這個系統視圖的用戶權限應該比較高,然后在記錄中找到table_name,最后編輯表的外鍵關聯,將on delete觸發的動作改為cascade。如果數據庫中數據庫表很多,關聯關系比較復雜,那么很可能在遇到問題之后要修改的外鍵關聯時的級聯刪除不止一個兩個。
??? 此外,說兩個題外話:
??? 第一,設置外鍵關聯的時候,級聯操作有三種設置方式:
??? 默認無動作:on delete no action;
??? 置空:on delete set null;
??? 級聯刪除:on delete cascade。
??? 第二,在drop表的時候,用drop table cascade constraints語句,只會刪除子表與父表之間的關聯關系,不會刪除子表中關聯父表的那些記錄。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
