如何在oracle中查询所有用户表的表名、主键名称、索引、外键等

本文提供了一套完整的Oracle数据库表结构查询方法,包括索引、主键、唯一性约束、外键及所有列属性的SQL查询语句。

1、查找表的所有索引(包括索引名,类型,构成列): select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表

 

2、查找表的主键(包括名称,构成列): select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and au.table_name = 要查询的表

 

3、查找表的唯一性约束(包括名称,构成列): select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'U' and au.table_name = 要查询的表

 

4、查找表的外键(包括名称,引用表的表名和对应的键名,下面是分成多步查询): select * from user_constraints c where c.constraint_type = 'R' and c.table_name = 要查询的表 查询外键约束的列名: select * from user_cons_columns cl where cl.constraint_name = 外键名称 查询引用表的键的列名: select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名

 

5、查询表的所有列及其属性 select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查询的表

<think>嗯,用户现在想查询Oracle主键索引方法。之前系统指令要求严格使用LaTeX格式,但这次主要是SQL查询,不需要数学公式,重点在准确性和实用性。 用户提供的两个引用很有价值。引用[1]展示了联合查询主键和唯一索引的完整SQL,其中用到了ALL_TABLES、DBA_CONSTRAINTS和DBA_INDEXES这几个系统视图。注意到它用OWNER字段加了模式前缀,这个细节很实用。引用[2]提到主键和唯一索引的关系,说明Oracle会自动为主键创建同索引。 用户真正的需求应该不只是照搬引用[1]的语句,而是需要灵活可定制的查询方案。考虑设计三种场景:查询单个查询某模式所有、联合查询主键+索引。每种场景都要说明视图选择依据——比如DBA_视图需要DBA权限而ALL_视图更通用。 在具体实现上,单查询用DBA_IND_COLUMNS比引用[2]的INDEX更合适,因为它包含列信息。对于主键-索引联合查询,考虑提示用户CONSTRAINT_TYPE的P/R/U区别,这个在引用[1]里没展开说明。另所有示例都考虑增加排序操作,结果默认按排列更易读。 安全方面需要强调权限问题,特别是DBA_视图可能导致普通用户无权限。考虑在第二个查询方案中用ALL_CONSTRAINTS替代DBA_CONSTRAINTS作为备选方案。最后补充索引类型说明时,准备点出NORMAL/BITMAP等类型区别,这对用户理解索引性质可能有帮助。 </think>以下是查询Oracle主键索引的详细方法及示例代码: ### 一、主键查询方法 #### 1. 查询主键 ```sql SELECT cols.column_name FROM all_constraints cons JOIN all_cons_columns cols ON cons.constraint_name = cols.constraint_name WHERE cons.owner = '模式' -- 替换为实际模式 AND cons.table_name = '' -- 替换为实际 AND cons.constraint_type = 'P' -- P主键 ORDER BY cols.position; ``` #### 2. 查询某模式下所有主键 ```sql SELECT cons.owner, cons.table_name, cols.column_name FROM all_constraints cons JOIN all_cons_columns cols ON cons.constraint_name = cols.constraint_name WHERE cons.owner = '模式' -- 替换为实际模式 AND cons.constraint_type = 'P' ORDER BY cons.table_name, cols.position; ``` ### 二、索引查询方法 #### 1. 查询索引 ```sql SELECT index_name, index_type, uniqueness, column_name FROM all_ind_columns ic JOIN all_indexes i ON ic.index_name = i.index_name WHERE ic.table_owner = '模式' -- 替换为实际模式 AND ic.table_name = '' -- 替换为实际 ORDER BY ic.column_position; ``` #### 2. 查询某模式下所有索引 ```sql SELECT table_name, index_name, index_type, uniqueness, column_name FROM all_ind_columns ic JOIN all_indexes i ON ic.index_name = i.index_name WHERE ic.table_owner = '模式' -- 替换为实际模式 ORDER BY table_name, index_name; ``` ### 三、主键索引联合查询(引用[1]优化版) ```sql SELECT owner || '.' || table_name AS "", (SELECT column_name FROM all_cons_columns WHERE constraint_name = cons.constraint_name AND ROWNUM = 1) AS "主键列", (SELECT index_name FROM all_constraints WHERE table_name = cons.table_name AND constraint_type = 'P') AS "主键索引" FROM all_constraints cons WHERE owner = '模式' -- 替换为实际模式 AND constraint_type = 'P' UNION ALL SELECT table_owner || '.' || table_name, column_name, index_name FROM all_ind_columns WHERE table_owner = '模式'; -- 替换为实际模式 ``` ### 关说明: 1. **权限要求**: - `DBA_`开头视图需要DBA权限 - `ALL_`视图显示当前用户有权限的对象 - `USER_`视图仅显示当前用户对象 2. **主键索引关系**: - 主键自动创建唯一索引(引用[2]) - 主键约束索引可能不同 - 删除主键时需手动删除关联索引(若需移除) 3. **结果字段含义**: - `constraint_type = 'P'`:主键 - `constraint_type = 'U'`:唯一约束 - `uniqueness = 'UNIQUE'`:唯一索引 - `index_type`:NORMAL/BITMAP/FUNCTION-BASED等 > **提示**:若查询无结果,请检查: > 1. 模式/大小写(建议大写) > 2. 当前用户权限(尝试用`USER_`替代`ALL_`) --- ### 相关问题 1. 如何判断Oracle索引是否被实际使用? 2. 主键索引和普通唯一索引在物理存储上有何区别? 3. 如何查询未被索引约束? 4. Oracle中删除主键时如何自动级联删除关联索引? 5. 如何分析索引碎片率并优化重建?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值