-1

嗨,是否可以使用 dba_tab_cols 查询检索主键和唯一键?

是否有任何查询可以让我检索以下所有字段?

  • 列名
  • 数据类型
  • 首要的关键
  • 空/非空
  • 唯一键
  • 默认值
  • 额外的
4

1 回答 1

1

主键和唯一键都可以跨越多个列,因此它们不属于dba_tab_columns. 您需要查看dba_constraintsdba_cons_columns获取该信息。

这是一个起点,也许:

select owner, table_name, column_name, data_type, primary_key,
  nullable, unique_key, data_default
from (
  select dtc.owner, dtc.table_name, dtc.column_id, dtc.column_name,
    dtc.data_type, dtc.nullable, dtc.data_default,
    case when dc.constraint_type = 'P' and dcc.column_name = dtc.column_name
      then dc.constraint_name end as primary_key,
    case when dc.constraint_type = 'U' and dcc.column_name = dtc.column_name
      then dc.constraint_name end as unique_key,
    row_number() over (partition by dtc.owner, dtc.table_name, dtc.column_id
      order by null) as rn
  from dba_tab_columns dtc
  left join dba_constraints dc
  on dc.owner = dtc.owner
  and dc.table_name = dtc.table_name
  and dc.constraint_type in ('P', 'U')
  left join dba_cons_columns dcc
  on dcc.owner = dc.owner
  and dcc.constraint_name = dc.constraint_name
  and dcc.table_name = dc.table_name
  and dcc.column_name = dtc.column_name
  where dtc.owner = '<owner>'
  and dtc.table_name = '<table_name>'
)
where rn = 1
order by owner, table_name, column_id;

我已经使用生成row_number值的子查询来完成此操作,因为您会为具有多个约束的表获得重复项;并且因为您想要默认值,即 a long(column data_default),所以您不能使用distinctor group by。感觉有点不雅,但我相信你可以努力得到你需要的东西。

也可以有一个复制not null版本的检查约束,尽管这不是可取的。并且唯一索引不会显示为唯一约束,因此您可能还想通过dba_indexes和查找其中之一dba_ind_columns。但是,用于备份唯一约束的索引将出现在两者中。

您也可以查看dbms_metadata.get_ddl以获取此信息,具体取决于您打算如何处理它。除了尝试在其他地方重新创建架构之外,我不确定为什么这会有用,并且有更好的工具可以做到这一点。

于 2013-08-07T16:44:18.753 回答