ORA-02266: 表中的唯一/主鍵被啟用的外鍵引用
(一):
在刪除有父子表關系的表的數據時,我們都知道要先刪除子表 再 刪除父表數據,或者先取消外鍵 然后再刪除。
昨天采用先刪子表 ,再刪父表,刪除時使用truncate,結果在刪除父表的時候,給出了這個提示:“表中的唯一/主鍵被啟用的外鍵引用”。
而改成delete則刪除成功。
網上給出的解釋是ddl與dml 的區別。這也是truncate與delete的又一個不同之處。
(二):
今天想truncate一張表,但報ORA-02266錯誤
想到可能是主鍵被子表引用,查了一下
解決如下:
SQL> truncate table c_location;
truncate table c_location *
ERROR 位於第 1 行:
ORA-02266: 表中的唯一/主鍵被啟用的外部關鍵字引用
SQL> alter table c_location disable primary key cascade;
表已更改。
SQL> truncate table c_location;
表已截掉。
SQL> alter table c_location enable primary key;
表已更改。
SQL>ALTER TABLE '子表' ENABLE CONSTRAINT '外鍵約束名';
*特別注意的是在ENABLE主鍵后不會自動恢復外鍵(沒有cascade選項),因此需要手工對引用該鍵的約束進行ENABLE。
由於此解決方法會disable掉關聯子表的外鍵,所以慎用。
(三)
1、ORACLE數據庫中的外鍵約束名都在表user_constraints中可以查到。其中constraint_type='R'表示是外鍵約束。
2、啟用外鍵約束的命令為:alter table 表名 enable constraint 約束名
3、禁用外鍵約束的命令為:alter table 表名 disable constraint 約束名
4、然后再用SQL查出數據庫中所以外鍵的約束名:
select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints where constraint_type='R'
