繁体   English   中英

时间间隔内的Oracle序列生成器

[英]Oracle sequence generator within interval

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

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

我怀疑任何外部生成器都将提供Oracle尚未提供的任何功能。 我建议使用序列进行批量插入。 您遇到的问题是如何回收ID。 Oracle普通序列不跟踪主键,因此您需要一种解决方案来首先找到回收的键,然后再回退到序列。

产品ID回收

  1. 批量插入-首次加载密钥时使用序列。 对于此较小的范围,请在序列上设置NOCACHE以消除间隙。
  2. 删除-删除产品后,而不是实际删除该行,而是在该行上设置DELETED ='Y'标志。
  3. 插入-使用DELETED标志集更新可用的第一条记录,或者从产品表中选择DELETED ='Y'的最小ID。 使用新产品信息(但具有相同的ID)更新记录,并设置DELETED ='N'

这样可以确保您始终在插入新序列ID之前进行回收

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

在任何情况下,当序列用完(或序列换行)用完时,对于批量插入您都是不走运的。 如果我是你,我会重新考虑设计的那部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM