2014-10-31 74 views
0

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

+0

请发表一个例子。 – 2014-10-31 06:37:37

+5

您确定要**重用产品ID **吗?从业务流程的角度来看,这几乎总是不是一个好主意 – 2014-10-31 06:38:27

回答

0

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

我怀疑任何外部生成器将提供Oracle尚未提供的任何内容。我建议使用批次插入序列。您遇到的问题是如何回收这些ID。 Oracle普通序列不会跟踪主键,因此您需要一个解决方案来首先查找循环密钥,然后回退到序列。

产品ID回收

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

这可以确保您插入新的序列编号

如果要实现在数据库中的逻辑之前,你总是回收记录,您可以创建一个视图(VIEW $ PRODUCTS),其中DELETED ='N'和一个INSTEAD OF INSERT触发器来执行插入操作。

在任何情况下,当您用完序列(或序列包装)时,对于批量插入而言运气不佳。如果我是你,我会重新考虑设计的这一部分。

+0

谢谢您的评论。 productID不是真正的主键:原因是我必须为1-65535范围内的每个人分配一个业务ID(出于商业原因)(然后,我将二进制文件中的此产品目录传输到无法处理的AVM高达16位最大产品ID)...目前我已经使用软删除,因为我需要跟踪历史记录,经过一段时间,我做了一个真正的删除...所以我无法使用您的解决方案。我想我需要有1到6535个有效的唯一产品ID。并且可能有相同标识的产品被标记为已停用... – Dypso 2014-10-31 10:39:56

+0

1至6535 - 这是一个错字吗? – codenheim 2014-10-31 14:41:11

+0

是的!那是在1到65535之间 – Dypso 2014-10-31 14:47:32