Oracle中约束键、ORA-02266错误

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

 

posted @ 2022-01-21 17:41  Faith_zhang  阅读(717)  评论(0编辑  收藏  举报