如何知道序列应用于哪一列?

时间:2010-06-17 17:42:27

标签: sql oracle plsql sequence

我必须获取所有序列及其表名以及应用序列的列名 。我是如何设法获取对应序列的表名,因为 在我的数据库序列中以名字作为表名存储 来自数据字典(all_sequences和all_tables)。

如果可能,请告诉我如何获取相应的列名!

3 个答案:

答案 0 :(得分:6)

在Oracle中,序列是一个独立的对象,它与特定的表或列无关。例如,您可以运行此查询以获取序列列表:

SELECT * FROM all_sequences

当你创建一个序列时,你会注意到CREATE SEQUENCE语法中没有任何内容表明你想要将它与一个表或列相关联。

一个序列只是一个唯一的数字生成器,它不关心你用它生成的数字做什么(即你是否将序列值插入表中等),它只是提供那个唯一的数字

因此,不可能告诉给定的列使用了什么序列(如果有的话)来生成该列的值。

答案 1 :(得分:2)

您可以通过查看all_sequences中的LAST_NUMBER和以下SQL(查看定义为主键一部分的数字列的最大数字)来“猜测”相关性。

select table_name, column_name, utl_raw.cast_to_number(high_value) 
from dba_tab_columns
where owner = '...'
and data_type = 'NUMBER'
and (owner, table_name, column_name) in 
  (select cc.owner, cc.table_name, cc.column_name
  from dba_cons_columns cc 
     join dba_constraints c 
       on cc.owner = c.owner and cc.constraint_name = c.constraint_name
  where c.constraint_type = 'P')
order by 3;

但是采用指示相关性的命名标准是个好主意(例如,与最后一个_SEQ的table_name相同)。

答案 2 :(得分:0)

请参阅dcp的回答。

但是,序列通常用于为其对应的表生成唯一键 - 尝试在匹配表上查找主键和/或唯一索引。