假设表t2的列fk_t2上有外键,依赖于t1表的pk_t1列,t3表的列fk_t3上有外键,依赖于t2表的pk_t2,即表t2既是父表也是子表,当将t2表数据清空重新导入时,很容易遇到外键冲突问题。
外键约束的四种状态:
(1)ENABLE VALIDATE:约束在创建时,默认就是此状态。此状态会“检查表中原有行和新插入的行”。
(2)ENABLE NOVALIDATE:不能输入违反约束的新数据。但是,在创建约束时,并不检查表中原有行。
(3)DISABLE VALIDATE:检查表中原有行是否违反约束,表中可以插入违反约束的行。
(4)DISABLE NOVALIDATE:约束处于禁用状态,且此状态检查表中原有数据是否违反约束.
truncate或drop一张表的时候,需要看他上面是否有外键,同时确认是否有别的表上存在外键依赖于这张表
可以通过如下SQL查找
select 'alter table '||t.owner||'.'||t.table_name||' disable constraint '||t.constraint_name||' ; ' as rr ---禁用该表的子表的外键
from dba_constraints t
where t.constraint_type = 'R'
and t.r_constraint_name in
(select constraint_name
from dba_constraints h
where h.table_name in ('&table1','&table2'))
union all
select 'alter table '||t1.owner||'.'||t1.table_name||' disable constraint '||t1.constraint_name||' ; ' as rr ---禁用该表上的外键
from dba_constraints t1
where t1.constraint_type = 'R'
and t1.table_name in ('&table1','&table2');
将拼接出来的SQL直接,即可禁用相应的外键约束,数据导入之后,再将外键启用。