2013-08-07 61 views
-1

嗨有可能使用dba_tab_cols查询检索主键和唯一键吗?Oracle dba_tab_cols查询

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

  • 列名
  • 数据类型
  • 主键
  • 空/非空
  • 唯一键
  • 默认值
  • 额外

回答

1

主要和唯一键可以跨越多个c olumn,所以他们不属于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价值,因为你会得到重复用于多个约束的表的子查询做到了这一点;并且因为您需要默认值long(列data_default),所以不能使用distinctgroup by。这感觉有点不雅,但我相信你可以在它上面得到你需要的东西。

也有可能有复制not null版本的检查约束,尽管这不是明智之举。一个独特的索引不会显示为一个唯一的约束,所以你可能还想通过dba_indexesdba_ind_columns寻找其中的一个。不过,用于备份独特约束的索引将出现在两者中。

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