sql - 获取表的主键名称

标签 sql oracle

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

我已经完成了一半的工作,但我不知道还要做什么。

select table_name from user_tables ORDER BY (table_name) ASC

有谁知道怎么做吗?

谢谢

最佳答案

这个简单的查询为您提供表列表以及 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 作为输入并提供连接的逗号分隔字符串作为输出。只是没有时间自己做;)

关于sql - 获取表的主键名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1319957/

相关文章:

java - 将 CSV 格式的 JSON 转换为表格

mysql - 如何对MySQL表进行分组,计算每个表的总行驶距离之间的差异

java - 数据库错误=ORA-01407 : cannot update ("XXX" ."XXX" ."VALUE") to NULL.

java - H2数据库和oracle模式-alter table only with different sql statement - Flyway迁移测试

sql - ORACLE - 无法将 NULL 值插入非主键

SQL 选择 HH :MM - HH:MM

sql - 在 SSMS 2000 的 TSQL 中,如何将不可空列更改为可空列?

java - Hibernate 事务计数器行为

java - 如何使用 createRow() 将行添加到 View 对象后删除行

MySql查询语法错误DATE_SUB