1.已知oracle数据库中有一个名为user_constraints的系统表,它主要用来管理当前登陆用户所拥有表的所有约束信息。
SQL>desc user_constraints;
名称 空值 类型
------------------------- -------- ------------------
OWNER NOT NULL VARCHAR2(30)
CONSTRAINT_NAME NOT NULL VARCHAR2(30)
CONSTRAINT_TYPE VARCHAR2(1)
TABLE_NAME NOT NULL VARCHAR2(30)
SEARCH_CONDITION LONG()
R_OWNER VARCHAR2(30)
R_CONSTRAINT_NAME VARCHAR2(30)
DELETE_RULE VARCHAR2(9)
STATUS VARCHAR2(8)
DEFERRABLE VARCHAR2(14)
DEFERRED VARCHAR2(9)
VALIDATED VARCHAR2(13)
GENERATED VARCHAR2(14)
BAD VARCHAR2(3)
RELY VARCHAR2(4)
LAST_CHANGE DATE
INDEX_OWNER VARCHAR2(30)
INDEX_NAME VARCHAR2(30)
INVALID VARCHAR2(7)
VIEW_RELATED VARCHAR2(14)
20 rows selected
2.其中将用到的字段主要有四个:
CONSTRAINT_NAME ---约束名
R_CONSTRAINT_NAME ---外键引用的约束名
CONSTRAINT_TYPE ---约束类型,比如其值:P表示主键,R表示外键,C表示非空
TABLE_NAME ---表名
3.举例如下:
假如有主表table1,我们要查找出引用了此表的所有从表。
步骤1. 找出主表的主键约束名
SQL>select a.constraint_name from user_constraints a where a.table_name = upper('table1 ') and a.constraint_type = 'P';
注意:表名要大写;后面的约束类型值为“P”,指主键约束。
步骤2. 通过查找出的主表约束名,找到所有引用了此主表的从表名。
SQL>select a.table_name from user_constraints a where a.r_constraint_name = ' 上面查出的约束名' ;
步骤3. 当然也可以一步到位,将以上步骤合二为一。
SQL>select a.table_name from user_constraints a where a.r_constraint_name in
(select b.constraint_name from user_constraints b where b.table_name = upper(' table1 ') and b.constraint_type = 'P')
或者可以更简洁:
select a.table_name from user_constraints a join user_constraints b
on a.r_constraint_name = b.constraint_name and b.table_name = upper(' table1 ')
and b.constraint_type = 'P' ;
说明:蓝色部分为可选条件,因为从表的外键一般都是引用的主表的主键,所以可以不加约束类型。