场景:
在truncate一张表的时候,会报ORA-02266(表中的唯一/主键被启用的外部关键字引用)错误。
解决办法:
禁用外键约束的命令为:alter table 表名 disable constraint 约束名
select 'alter table ' || table_name || ' disable constraint ' || constraint_name || ';'
from user_constraints
where R_CONSTRAINT_NAME in
(select constraint_name from user_constraints where table_name = upper('XXX'));
刨根问底:
1、约束键
包括:not null、unique、primary key, foreign key和check五种。
可以在Oracle数据库中USER_CONSTRAINTS查到所有约束键,包含多种约束键constraint_type。
constraint_type |
说明 |
对象 |
说明 |
C |
Check on a table |
Column |
检查 |
O |
Read Only on a view |
Object | |
P |
Primary Key |
Object |
主键 |
R |
Referential AKA Foreign Key |
Column |
外部键 |
U |
Unique Key |
Column |
唯一 |
V |
Check Option on a view |
Object |
1)NOT NULL (非空):列定义了NOT NULL,对应的列插入数据时不能为NULL。
2)CHECK (检查):检查在约束中指定的条件是否得到了满足。
3)UNIQUE (唯一):保证在指定的列中没有重复值,在该表中每一个值或者每一组值都将是唯一的。
4)PRIMARY KEY (主键):用来唯一的标识出表的每一行数据,主键列不能重复且不能为NULL值,一个表只能有一个主键约束,但是可以由多个UNIQUE 唯一约束。
5)POREIGN KEY (外部键):在表之间建立一种父子(parent-child)或主从表关系,在表上定义的外部键(定义在从表上)可以指向主键或者其他表的唯一键,要求外键列数据必须在主表的主键列存在。
2、ORA-02266:表中的唯一/主键被启用的外部关键字引用
在truncate一张表的时候,会报ORA-02266(表中的唯一/主键被启用的外部关键字引用)错误。
代表这个表存在主外键关系,那必须是先删除子表 再 删除父表数据,或者先取消外键 然后再删除。
1)、根据ORACLE数据库表user_constraints查相关的主外键。其中constraint_type='R'表示是外键约束。
--表XXX的主键对应的外键表
select a.owner --主键拥有者(登录用户) ,a.table_name --主键表 ,b.column_name --主键列 ,c.OWNER --外键拥有者 ,c.table_name --外键表 ,d.column_name --外键列
from user_constraints a--表约束的视图。 left join user_cons_columns b--表约束字段的视图 on a.constraint_name=b.constraint_name left join user_constraints c on c.R_CONSTRAINT_NAME=a.constraint_name left join user_cons_columns d on c.constraint_name=d.constraint_name
where a.constraint_type='P' and a.table_name='XXX' order by a.table_name;--需要查看主外键关系的表
--查出用表XXX字段做外键的表
select * FROM
user_constraints
where R_CONSTRAINT_NAME in (select constraint_name from user_constraints where table_name = upper('XXX')) ;
--查出I表XXX对应的键(constraint_type='R')
SELECT * from user_constraints where table_name ='XXX';
2)、启用外键约束的命令为:alter table 表名 enable constraint 约束名
select 'alter table ' || table_name || ' enable constraint ' || constraint_name || ';' from user_constraints where R_CONSTRAINT_NAME in (select constraint_name from user_constraints where table_name = upper('XXX'));
3)、禁用外键约束的命令为:alter table 表名 disable constraint 约束名
select 'alter table ' || table_name || ' disable constraint ' || constraint_name || ';' from user_constraints where R_CONSTRAINT_NAME in (select constraint_name from user_constraints where table_name = upper('XXX'));