-1
A
回答
1
主要和唯一键可以跨越多个c olumn,所以他们不属于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
价值,因为你会得到重复用于多个约束的表的子查询做到了这一点;并且因为您需要默认值long
(列data_default
),所以不能使用distinct
或group by
。这感觉有点不雅,但我相信你可以在它上面得到你需要的东西。
也有可能有复制not null
版本的检查约束,尽管这不是明智之举。一个独特的索引不会显示为一个唯一的约束,所以你可能还想通过dba_indexes
和dba_ind_columns
寻找其中的一个。不过,用于备份独特约束的索引将出现在两者中。
您也可以查看dbms_metadata.get_ddl
以获取此信息,具体取决于您打算如何处理它。我不确定为什么这会很有用,除了尝试在别处重新创建模式外,还有更好的工具可以做到这一点。
相关问题
- 1. Oracle查询链接查询
- 2. Oracle查询内部查询
- 3. sql查询/ oracle
- 4. Oracle XMLtype查询
- 5. Oracle查询
- 6. Oracle查询
- 7. Oracle-sql查询
- 8. 在Oracle查询
- 9. ORACLE SQL查询
- 10. Oracle子查询
- 11. 难Oracle查询
- 12. Pivot Oracle查询
- 13. SQL Oracle查询
- 14. Oracle SQL +查询
- 15. long oracle查询
- 16. Oracle查询Regexp_substr
- 17. 与Oracle查询
- 18. ASP.NET Oracle查询
- 19. 优化Oracle查询
- 20. Oracle SQL LIKE查询
- 21. 多个Oracle查询
- 22. Sum子查询Oracle
- 23. Oracle多维查询
- 24. 的Oracle SQL查询
- 25. Oracle查询问题
- 26. oracle查询组列
- 27. Oracle查询选择
- 28. 优化oracle查询
- 29. ORACLE SQL Developer(查询)
- 30. ORACLE SQL查询 - AVG