【问题标题】:how to know on which column,the sequence is applied?如何知道在哪一列上应用了序列?
【发布时间】:2010-06-18 06:54:51
【问题描述】:

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

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

【问题讨论】:

标签: sql oracle plsql sequence


【解决方案1】:

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

SELECT * FROM all_sequences

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

序列只是一个唯一的数字生成器,它不关心你如何处理从它生成的数字(即是否将序列值插入到表中等),它只是提供唯一的数字.

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

【讨论】:

    【解决方案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 相同)。

    【讨论】:

      【解决方案3】:

      查看 dcp 的回答。

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

      【讨论】:

      • @Mark Ba​​nnister - 我认为这真的取决于。在我的商店中,我们为每个模式使用一个序列,而不是每个表。
      • @dcp - 抱歉,我不应该说“正常”。然而,在 Vineet 的案例中,看起来这些序列确实与特定的表格相关。我只是希望每张桌子不超过一个序列...
      • @Mark:你如何定义“对应”和“匹配”?为什么每个表有多个序列是一件坏事?
      • @dcp,你为它的缓存设置了什么?
      • @dcp,一个序列有一个缓存子句?您对整个架构使用 1 个序列并且还没有探索缓存的效果?好的,所以这是一个非常低并发的数据库?不是很多同时插入?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      相关资源
      最近更新 更多