注:本文来源于《oracle查询某张表的外键(最终解决办法)》
一:几个查询表外键的脚本
select b.table_name, b.column_name from user_constraints a inner join user_cons_columns b on a.constraint_name = b.constraint_name where a.r_constraint_name in ( select e.constraint_name from user_constraints e where e.table_name = 'GK_ZWVCH' )
Oracle 查看一个表对应的主键和外键的约束关系,查看的语句:
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='GK_ZWVCH' --需要查看主外键关系的表 order by a.table_name
二:truncate 有外键关系的表数据
问题原因
虽然truncate table在删除数据的速度上会占有一定的优势,但并不是在所有的情况我们都可以使用truncate,存在以下情况就使用truncate就会失败。
1,要删除数据的表包含foreign key约束(被其他表引用),而delete则可以通过级联删除来删除相关联的数据。
2,被索引视图引用过的表,也不能使用truncate。
解决方案
有外键的表只能用delete,不能用truncate,这是语法规定,要么就取消外键再truncate。
可以先禁用外键约束,删除完毕后,再启动外键约束。
查找外键关联
SELECT T1.TABLE_NAME, T2.TABLE_NAME AS "TABLE_NAME(R)", T1.CONSTRAINT_NAME, T1.R_CONSTRAINT_NAME AS "CONSTRAINT_NAME(R)", A1.COLUMN_NAME, A2.COLUMN_NAME AS "COLUMN_NAME(R)" FROM USER_CONSTRAINTS T1 INNER JOIN USER_CONSTRAINTS T2 ON T1.R_CONSTRAINT_NAME = T2.CONSTRAINT_NAME INNER JOIN USER_CONS_COLUMNS A1 ON T1.CONSTRAINT_NAME = A1.CONSTRAINT_NAME INNER JOIN USER_CONS_COLUMNS A2 ON T1.R_CONSTRAINT_NAME = A2.CONSTRAINT_NAME WHERE T2.TABLE_NAME = '要删的表名';
外键禁用/开启
--禁用约束: alter table XXX disable constraint XXX; --启用约束 alter table XXX enable constraint XXX;