oracle 主外键数量怎么查_查看oracle数据库表的主外键的关系【转】

在日常数据维护中,经常删除数据,要是这些数据所在的表有外键关联,又不设置成级联删除的话,就需要先清空子表的相关数据了。要找出所有的主外键的关联是一个比较头疼的事情,下面给出一个例子,可以得到某用户下的所有主外键关系:

select

rpad(pk.pk_con,25,'.')||pk_table||'('||pk_col||')' pk_info ,

rpad(fk.fk_con,35,'.')||fk_table||'('||fk_col||')' fk_info

from

(select

a.constraint_name pk_con,

a.table_name pk_table,b.column_name pk_col,

a.owner pk_owner

from user_constraints a,user_cons_columns b

where (a.constraint_type='P' or a.constraint_type='U')

and a.constraint_name=b.constraint_name

and a.owner=b.owner) pk,

(select c.constraint_name fk_con,

c.table_name fk_table,

d.column_name fk_col,

c.R_OWNER r_pk_owner,

c.R_CONSTRAINT_NAME r_pk_con,

c.owner fk_owner

from user_constraints c,user_cons_columns d

where c.constraint_type='R'

and c.constraint_name=d.constraint_name

and c.owner=d.owner) fk

where pk.pk_owner=fk.r_pk_owner

and pk.pk_con=fk.r_pk_con

order by pk.pk_con

;

PK_INFO FK_INFO

------------------------------------------------------- --------------------------------------------------------------------

PK_CATEGORY..............CATEGORY(CATEGORY_ID) FK_TAG_GROU_TAG_GROUP_CATEGORY.....TAG_GROUP(CATEGORY_ID)

PK_CHANNEL...............CHANNEL(CHANNEL_ID) FK_CATEGORY_CATEGORY__CHANNEL......CATEGORY(CHANNEL_ID)

PK_CLOB_CONTENT..........CLOB_CONTENT(CLOB_CONTENT_ID) FK_ITEM_ITEM_REF__CLOB_CON.........ITEM(INFO_CONTENT_ID)

PK_ITEM..................ITEM(ITEM_ID) FK_ITEM_TAG_ITEM_TAG__ITEM.........ITEM_TAG(ITEM_ID)

PK_TAG...................TAG(TAG_ID) FK_CATEGORY_REF_TAG................CATEGORY(CATEGORYS_SELF_TAG_ID)

PK_TAG...................TAG(TAG_ID) FK_ITEM_TAG_ITEM_TAG__TAG..........ITEM_TAG(TAG_ID)

PK_TAG...................TAG(TAG_ID) FK_SELLER_T_SELLER_TA_TAG..........SELLER_TAG(TAG_ID)

PK_TAG...................TAG(TAG_ID) FK_ITEM_ITEM_ITEM_TAG..............ITEM(ITEM_SELF_TAG_ID)

PK_TAG_GROUP.............TAG_GROUP(TAG_GROUP_ID) FK_TAG_TAG_REF_T_TAG_GROU..........TAG(TAG_GROUP_ID)

PK_USERS.................USERS(USER_ID) FK_FLEA_MARKET_INFO_USER_ID........FLEA_MARKET_INFO(USER_ID)

PK_USERS.................USERS(USER_ID) FK_SELLER_T_SELLER_TA_USERS........SELLER_TAG(SELLER_ID)

PK_USERS.................USERS(USER_ID) FK_REVIEWRA_REFERENCE_USERS........REVIEWRATE(USER_ID)

12 rows selected

不过这个只适用于没有组合主外键的情况,如果库中包含组合的主外键关系,则需要先建立一个函数

--构造函数返回组合主键和外键对应的列

CREATE OR REPLACE FUNCTION get_str(p_constraint_name varchar2)

RETURN VARCHAR2

IS

l_column_name VARCHAR2(4000);

BEGIN

FOR cur IN (SELECT column_name,position FROM user_cons_columns

WHERE CONSTRAINT_NAME=p_constraint_name order by position) LOOP

if cur.position=1 or cur.position is null then

l_column_name := cur.column_name;

else

l_column_name := l_column_name||','||cur.column_name;

end if;

END LOOP;

RETURN l_column_name;

END;

--包含组合主键与组合外键的联系(包含普通主外键的联系)

select

rpad(fk.fk_con,35,'.')||fk_table||'('||fk_col||')' fk_info,

rpad(pk.pk_con,35,'.')||pk_table||'('||pk_col||')' pk_info

from

(select distinct

a.constraint_name pk_con,

a.table_name pk_table,

get_str(a.constraint_name) pk_col,

a.owner pk_owner

from user_constraints a,user_cons_columns b

where (a.constraint_type='P' or a.constraint_type='U')

and a.constraint_name=b.constraint_name

and a.owner=b.owner) pk,

(select distinct

c.constraint_name fk_con,

c.table_name fk_table,

get_str(c.constraint_name) fk_col,

c.R_OWNER r_pk_owner,

c.R_CONSTRAINT_NAME r_pk_con,

c.owner fk_owner

from user_constraints c,user_cons_columns d

where c.constraint_type='R'

and c.constraint_name=d.constraint_name

and c.owner=d.owner) fk

where pk.pk_owner=fk.r_pk_owner

and pk.pk_con=fk.r_pk_con

;

FK_INFO PK_INFO

-------------------------------------------------- --------------------------------------------------

FK_T2..............................T2(B) PK_T1..............................T1(A)

FK_T4..............................T4(E,F) PK_T3..............................T3(A,B)

转自:http://space6212.itpub.net/post/12157/107584

posted on 2009-03-09 15:44 chenlh 阅读(806) 评论(0)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值