获取表的主键名称

时间:2009-08-24 00:21:33

标签: sql oracle

我想知道如何列出用户表名称及其主键名称作为第二列?

我正在做一半的工作,但我不知道还能做什么。

select table_name from user_tables ORDER BY (table_name) ASC

有谁知道怎么做?

谢谢

3 个答案:

答案 0 :(得分:3)

这个简单的查询为您提供了一个表列表以及PK约束名称(但不是列名称):

select     ut.table_name, uc.constraint_name
from       user_tables ut
left join  user_constraints uc
  on       ut.table_name = uc.table_name
  and      uc.constraint_type = 'P';

如果您想要列名,请记住PK可以有多个列!我们需要首先创建一个实用程序类型,因为collect()聚合函数:

create type ty_varchar_nt as table of varchar2(4000);

select     ut.table_name, uc.constraint_name, cast(collect (uic.column_name) as ty_varchar_nt) as pk_cols
from       user_tables ut
left join  user_constraints uc
  on       ut.table_name = uc.table_name
  and      uc.constraint_type = 'P'
left join  user_ind_columns uic
  on       uc.index_name = uic.index_name
group by ut.table_name, uc.constraint_name;

如果您不喜欢嵌套选项卡的格式,可以编写一个实用程序函数,它将NT作为输入并提供连接的逗号分隔字符串作为输出。只是没有时间自己做;)

答案 1 :(得分:1)

尝试使用 USER_CONSTRAINTS 加入 USER_TABLES

USER_CONSTRAINTS 过滤所有 constraint_type 的行等于'P'(主键)。在那里,您将获得 index_name index_owner 值,您可以使用 USER_INDEXES 加入这些值,并从PRIMARY KEY获取列名称。

我希望我知道一种更直接的方式......但我没有。

祝你好运!

答案 2 :(得分:1)

您可以使用以下查询

SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM all_constraints cons, all_cons_columns cols
WHERE cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position;