区间内的Oracle序列生成器

时间:2014-10-31 06:24:48

标签: oracle sequences

我使用oracle 11gr2和插入新产品时的产品表我需要指定一个从1到65535的自动增量ID。然后可以删除产品。 当我到达65535时,我需要扫描表格以找到一个用于分配新ID的空闲孔。 因为我有这个要求oracle序列无法使用,所以我使用一个函数(也尝试插入触发器)以生成一个空闲的id ...  问题是我无法处理批量插入,例如我有并发问题...... 我该怎么解决这个问题?通过使用某种外部Id生成器?

1 个答案:

答案 0 :(得分:0)

听起来像任意设计。是否有充分的理由拥有16位最大产品ID或重用ID?这两种限制都是不好的做法。

我怀疑任何外部发电机都将提供Oracle尚未提供的任何东西。我建议使用序列进行批量插入。您遇到的问题是如何回收ID。 Oracle普通序列不会跟踪主键,因此您需要一个解决方案来首先查找循环密钥,然后可能回退到序列。

产品ID回收

  1. 批量插入 - 首次加载时使用键序列。对于这个小范围,在序列上设置NOCACHE以消除间隙。
  2. 删除 - 删除产品时,不要实际删除该行,而是设置DELETED =' Y'行上的旗帜。
  3. 插入 - 更新可用DELETED标志设置的第一条记录,或者从产品表中选择最小ID,其中DELETED =' Y'。使用新产品信息更新记录(但ID相同)并设置DELETED =' N'
  4. 这可确保您在插入新序列ID之前始终循环使用

    如果要在数据库中实现逻辑,可以创建一个视图(VIEW $ PRODUCTS),其中DELETED =' N'和一个INSTEAD OF INSERT触发器来执行插入。

    在任何情况下,当您用完序列(或序列包装)时,您都不方便批量插入。如果我是你,我会重新考虑那部分设计。