ORA-02266 / 有外键依赖时truncate table

实际案例:

https://mp.weixin.qq.com/s/Kz_SynNDfadUKB2UR7I54w

从公众号转载的。能学到东西的公众号。

有几个知识点没有弄明白:

1. 查看10046事件(文章中有使用10046及说明)

2. 延迟段概念

3. user_constraint视图,查看表结构

 

下面记录学到的一些东西

一、ORA-02246报错

表中的唯一/主键被启用的外键引用

重现场景如下:

create table a_1(id number);

create table b_1(id number, id_a_1 number);

alter table a_1 add constraint pk_a_1 primary key(id);

alter table b_1 add constraint fk_b_1 foreign key(id_a_1) references a_1(id);

基本数据准备完毕。

此时执行truncate table b_1; 可以执行成功

truncate table a_1;  也可以执行成功

但如果:

insert into b_1 values (1,100);  执行报ORA-02291 违反完整性约束条件。即外键错误

执行insert into a_1  values(100); insert into b_1 values(1,100); 先插入a_1表,再插入b_1表。

此时再执行truncate语句:

truncate table b_1; 可以执行成功。

但执行turncate table a_1;  报错:ORA-02266 

公众号的文章中说:"究其原因,这和truncate操作有关,因为truncate是DDL,但是DDL语句不会检查约束,换句话说,他不知道子表有没有数据依赖于他,索性不让做了。"以下验证这句话:找一个DDL语句验证,执行结果是否相同

执行drop table a_1; 报错:ORA-02266(无论a_1表和b_1表是否有数据)。

----drop table a_1时,发现有外键依赖于a_1表。所以直接报错。

只有先drop table b_1;  再执行drop table a_1;  才可以成功!(drop table b_1之后,外键约束也即将消失,所以drop table a_1也会成功)

二、有外键约束时删除主表数据

都是公众号里提供的方法:

主表:a_1

外表:b_1

两表都有数据!现在要将两个表的数据清空。

对于b_1表,可以使用truncate语句或delete语句;

对于a_1表,使用delete语句。delete不适合于数据量很大的场景。

或者由公众号所说的方法,禁用约束-truncate-启用约束

 

 

 

 

 

 

 

上一篇:数据表数据的增删减操作


下一篇:TRUNCATE - 清空一个表