实际案例:
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-启用约束