user_constraints,user_cons_columns查看外键

来源:http://blog.youkuaiyun.com/maqinqin/archive/2009/05/26/4217045.aspx

 

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='XXX' --需要查看主外键关系的表
order by a.table_name

 

另外的一种写法

select
a.owner 外键拥有者,
a.table_name 外键表,
substr(c.column_name,1,127) 外键列,
b.owner 主键拥有者,
b.table_name 主键表,
substr(d.column_name,1,127) 主键列
from
user_constraints a,
user_constraints b,
user_cons_columns c,
user_cons_columns d
where
    a.r_constraint_name=b.constraint_name
and a.constraint_type='R'
and b.constraint_type='P'
and a.r_owner=b.owner
and a.constraint_name=c.constraint_name
and b.constraint_name=d.constraint_name
and a.owner=c.owner
and a.table_name=c.table_name
and b.owner=d.owner
and b.table_name=d.table_name

 

数据字典表列说明:

desc user_constraints


Name Comments
OWNER 表的所有者
CONSTRAINT_NAME 约束名
CONSTRAINT_TYPE 约束类型
TABLE_NAME Name associated with table with constraint definition
SEARCH_CONDITION Text of search condition for table check
R_OWNER Owner of table used in referential constraint
R_CONSTRAINT_NAME Name of unique constraint definition for referenced table
DELETE_RULE The delete rule for a referential constraint
STATUS Enforcement status of constraint -  ENABLED or DISABLED
DEFERRABLE Is the constraint deferrable - DEFERRABLE or NOT DEFERRABLE
DEFERRED Is the constraint deferred by default -  DEFERRED or IMMEDIATE
VALIDATED Was this constraint system validated? -  VALIDATED or NOT VALIDATED
GENERATED Was the constraint name system generated? -  GENERATED NAME or USERNAME
BAD Creating this constraint should give ORA-02436.  Rewrite it before2000 AD.
RELY If set, this flag will be used in optimizer
LAST_CHANGE The date when this column was last enabled or disabled
INDEX_OWNER The owner of the index used by the constraint
INDEX_NAME The index used by the constraint
INVALID  
VIEW_RELATED
  


desc user_cons_columns;


Name Default Comments
OWNER Owner of the constraint definition
CONSTRAINT_NAME Name associated with the constraint definition
TABLE_NAME Name associated with table with constraint definition
COLUMN_NAME Name associated with column or attribute of object column specified in the constraint definition
POSITION Original position of column or attribute in definition

desc后发现


user_constraints是表约束的视图,描述的是约束类型(constraint_type)是什么,属于哪些表(table_name),如果约束的类型为R(外键)的话,那么r_constraint_name字段存放的就是被引用主表中的主键约束名。   


user_cons_columns是表约束字段的视图,说明表中的和约束相关的列参与了哪些约束。这些约束有主键约束,外键约束,索引约束.
两者可以通过(owner,constraint_name,table_name)关联

 

1、达梦数据库使用以下SQL查询元数据信息发现无法查出主、索引信息 2、SELECT A.TABLE_NAME TABLE_NAME , A.COLUMN_NAME NAME , A.DATA_TYPE TYPENAME , A.DATA_LENGTH LENGTH , A.DATA_PRECISION PRECISION , A.DATA_SCALE SCALE , A.DATA_DEFAULT , A.NULLABLE , DECODE(B.COMMENTS, NULL, A.COLUMN_NAME, B.COMMENTS) DESCRIPTION, ( SELECT COUNT(*) FROM USER_CONSTRAINTS CONS, USER_CONS_COLUMNS CONS_C WHERE CONS.CONSTRAINT_NAME=CONS_C.CONSTRAINT_NAME AND CONS.CONSTRAINT_TYPE='P' AND CONS.TABLE_NAME =B.TABLE_NAME AND CONS_C.COLUMN_NAME =A.COLUMN_NAME AND CONS.OWNER ='IBPS_SAAS_SAAS_TEST_ZTESTZ_IBPS_BUSINESS_PROVIDER' ) AS IS_PK, ( SELECT COUNT(*) FROM USER_CONSTRAINTS CONS, USER_CONS_COLUMNS CONS_C WHERE CONS.CONSTRAINT_NAME=CONS_C.CONSTRAINT_NAME AND CONS.CONSTRAINT_TYPE='R' AND CONS.TABLE_NAME =B.TABLE_NAME AND CONS_C.COLUMN_NAME =A.COLUMN_NAME AND CONS.OWNER ='IBPS_SAAS_SAAS_TEST_ZTESTZ_IBPS_BUSINESS_PROVIDER' ) AS IS_FK, ( SELECT COUNT(*) FROM USER_IND_COLUMNS, USER_INDEXES WHERE USER_IND_COLUMNS.INDEX_NAME = USER_INDEXES.INDEX_NAME AND USER_IND_COLUMNS.TABLE_NAME =B.TABLE_NAME AND USER_IND_COLUMNS.COLUMN_NAME=A.COLUMN_NAME AND USER_INDEXES.TABLE_OWNER ='IBPS_SAAS_SAAS_TEST_ZTESTZ_IBPS_BUSINESS_PROVIDER' ) AS IS_IDX FROM ALL_TAB_COLUMNS A, ALL_COL_COMMENTS B WHERE A.COLUMN_NAME =B.COLUMN_NAME AND A.OWNER = B.SCHEMA_NAME AND A.TABLE_NAME = B.TABLE_NAME AND upper(A.TABLE_NAME)='ZTESTZ_DEC' AND A.OWNER ='IBPS_SAAS_SAAS_TEST_ZTESTZ_IBPS_BUSINESS_PROVIDER' ORDER BY A.COLUMN_ID
03-08
CREATE OR REPLACE PROCEDURE PRO_CREATE_CONSTRAINT ( iv_constraint_name in varchar2, iv_table_name in varchar2, iv_columns_name in varchar2, iv_sql_create_constraint in varchar2 )authid current_user as vi_cnt1 number(10) :=0; vi_cnt2 number(10) :=0; vi_new_count number(10) :=0; vi_old_count number(10) :=0; vv_cons_name varchar2(100) :=''; vv_cons_cols varchar2(100) :=''; begin SELECT COUNT(1) INTO vi_cnt1 FROM MY_CONSTRAINTS t WHERE t.CONSTRAINT_NAME = upper(iv_constraint_name) AND t.TABLE_NAME = upper(iv_table_name) AND t.CONS_COLS = upper(iv_columns_name); if vi_cnt1 = 0 then SELECT COUNT(1) INTO vi_cnt2 FROM MY_CONSTRAINTS t WHERE t.TABLE_NAME = upper(iv_table_name) AND t.CONSTRAINT_TYPE = 'P'; if vi_cnt2 > 0 then SELECT CONSTRAINT_NAME,CONS_COLS INTO vv_cons_name,vv_cons_cols FROM MY_CONSTRAINTS t WHERE t.TABLE_NAME = upper(iv_table_name) AND t.CONSTRAINT_TYPE = 'P'; if iv_columns_name = vv_cons_cols AND iv_constraint_name != vv_cons_name then EXECUTE IMMEDIATE 'ALTER TABLE ' || iv_table_name || ' RENAME CONSTRAINT ' || vv_cons_name || ' to ' || iv_constraint_name; SELECT COUNT(1) INTO vi_new_count FROM my_indexes t WHERE t.index_name = upper(iv_constraint_name); SELECT COUNT(1) INTO vi_old_count FROM my_indexes t WHERE t.index_name = upper(vv_cons_name); if vi_old_count >0 AND vi_new_count=0 then EXECUTE IMMEDIATE 'ALTER INDEX ' || vv_cons_name || ' RENAME TO ' || iv_constraint_name; end if; elsif iv_columns_name != vv_cons_cols then EXECUTE IMMEDIATE 'ALTER TABLE ' || iv_table_name || ' DROP CONSTRAINT IF EXISTS ' || vv_cons_name; EXECUTE IMMEDIATE 'DROP INDEX IF EXISTS ' || vv_cons_name; EXECUTE IMMEDIATE iv_sql_create_constraint; end if; else EXECUTE IMMEDIATE iv_sql_create_constraint; end if; end if; end; / EXEC PRO_CREATE_CONSTRAINT('PK_CPS_BULK_TYPE_CONFIG','CPS_BULK_TYPE_CONFIG','TYPE_NAME,APPLY_OBJECT','ALTER TABLE CPS_BULK_TYPE_CONFIG ADD CONSTRAINT IF NOT EXISTS PK_CPS_BULK_TYPE_CONFIG PRIMARY KEY (TYPE_NAME,APPLY_OBJECT) USING INDEX TABLESPACE {{TABLESPACE_INDEX}} '); ALTER TABLE CPS_BULK_TYPE_CONFIG MODIFY APPLY_OBJECT VARCHAR2(2) NOT NULL; DROP PROCEDURE IF EXISTS PRO_CREATE_CONSTRAINT;
最新发布
08-13
SELECT su.user_id, su.user_name, aui.user_parent_id, su1.user_name AS user_parent_name, COUNT(DISTINCT aui1.user_id) AS member_num_one, -- 一级邀请人数 COUNT(DISTINCT aui2.user_id) AS member_num_two, -- 二级邀请人数 COUNT(DISTINCT aui1.user_id) + COUNT(DISTINCT aui2.user_id) AS total_member_num, -- 总邀请人数 ( SELECT IFNULL(SUM(ad.balance), 0) FROM app_detail ad WHERE ad.user_id = su.user_id AND ad.flow = 1 AND ad.type IN (9,22) ) AS total_commissions, -- 总佣金 ( SELECT IFNULL(SUM(ad.balance), 0) FROM app_detail ad WHERE ad.user_id = su.user_id AND ad.flow = 1 AND ad.type IN (9,22) AND create_time >= CURDATE() - INTERVAL 1 DAY ) AS total_yesterday, -- 昨天总佣金 ( SELECT IFNULL(SUM(ad.balance), 0) FROM app_detail ad WHERE ad.user_id = su.user_id AND ad.flow = 1 AND ad.remark = "DirectPush" AND create_time >= CURDATE() - INTERVAL 1 DAY ) AS direct_push_yesterday, -- 昨天直推 ( SELECT IFNULL(SUM(ad.balance), 0) FROM app_detail ad WHERE ad.user_id = su.user_id AND ad.flow = 1 AND ad.type IN (9) AND create_time >= CURDATE() - INTERVAL 1 DAY ) AS transaction_yesterday, -- 昨天流水 ( SELECT IFNULL(SUM(ad.balance), 0) FROM app_detail ad WHERE ad.user_id = su.user_id AND ad.flow = 1 AND ad.type IN (22) AND create_time >= CURDATE() - INTERVAL 1 DAY ) AS recharge_yesterday -- 昨天充值 FROM sys_user su LEFT JOIN app_user_info aui ON su.user_id = aui.user_id LEFT JOIN sys_user su1 ON su1.user_id = aui.user_parent_id LEFT JOIN app_user_info aui1 ON aui.user_id = aui1.user_parent_id LEFT JOIN app_user_info aui2 ON aui1.user_id = aui2.user_parent_id WHERE su.status = 0 <if test="bo.userId != null">AND su.user_id LIKE CONCAT('%', #{bo.userId}, '%')</if> GROUP BY su.user_id, su.user_name 最终结果是app_user_info 有数据才返回所有
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值