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'