嗨,是否可以使用 dba_tab_cols 查询检索主键和唯一键?
是否有任何查询可以让我检索以下所有字段?
- 列名
- 数据类型
- 首要的关键
- 空/非空
- 唯一键
- 默认值
- 额外的
主键和唯一键都可以跨越多个列,因此它们不属于dba_tab_columns
. 您需要查看dba_constraints
并dba_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
),所以您不能使用distinct
or group by
。感觉有点不雅,但我相信你可以努力得到你需要的东西。
也可以有一个复制not null
版本的检查约束,尽管这不是可取的。并且唯一索引不会显示为唯一约束,因此您可能还想通过dba_indexes
和查找其中之一dba_ind_columns
。但是,用于备份唯一约束的索引将出现在两者中。
您也可以查看dbms_metadata.get_ddl
以获取此信息,具体取决于您打算如何处理它。除了尝试在其他地方重新创建架构之外,我不确定为什么这会有用,并且有更好的工具可以做到这一点。