ORA-02266 表中的唯一主键被启用的外键引用,问题处理

场景:

        在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'));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值