PS:這里是給自己做個備忘,下次遇到同類問題的時候,方便查找;
客戶在有主外鍵關系的2張表進行頁面刪除時報錯已有子記錄,運維后台處理的時候應該找出相應的數據,先刪除子記錄,在刪主表記錄;但客戶要的急,就執行了錯誤的操作,刪除了外鍵約束,在執行的刪除,但在通過alter語句進行添加外鍵的時候,報錯未找到父項關鍵字;
網上搜索了下,說未找到父項關鍵字的原因是2張表的數據不統一,后通過minus關鍵字查詢2張表的差值,確實存在;
在google之后發現了2種方法可以解決:
1、刪除多余的數據,保持2張表數據統一,在執行 alter table 表1 add constraint FK_XXX foreign key(字段1) references 表2 (字段2);就不會報錯了;
(ps:這種方式在實際生產過程中不實際,生產環境數據不能隨便刪除的,所以這種方式不現實,不推薦)
2、在alter語句之后加上enable novalidate即可,即
alter table 表1 add constraint FK_XXX foreign key(字段1) references 表2 (字段2) enable novalidate;
(ps:enable novalidate指的是允許已有記錄不滿足約束條件,但新增/修改的記錄則必須滿足約束條件)
這是其他3種的含義:
Enable Validate與Enable相同,檢查已有記錄和新增記錄,確保都符合約束;
Disable Validate禁用約束,刪除約束上的索引,不允許修改任何被約束的記錄;
Disable Novalidate與Disable相同,禁用約束,刪除約束上的索引,且允許修改被約束的記錄。
---------------------
關於oracle約束關鍵字Enable/Disable/Validate/Novalidate的詳情,可以查看這篇原文,傳送門
原文:https://blog.csdn.net/huang_xw/article/details/6396846