我正在使用oracle 11gr2,并且在插入新产品时用于产品表我需要指定从1到65535的自动增量编号。然后可以删除产品。 当我到达65535时,我需要扫描表格以找到一个空洞来指定新的ID。 因为我有这个需求oracle序列无法使用,所以我正在使用一个函数(也试图插入一个触发器),以便生成一个空闲的ID ... 问题是,我无法处理批处理插入例如我有并发问题... 我怎么能解决这个问题?通过使用某种外部Id生成器?间隔内的Oracle序列发生器
回答
听起来像任意设计。有16位最大产品ID或重用ID的充分理由吗?两种限制都是不好的做法。
我怀疑任何外部生成器将提供Oracle尚未提供的任何内容。我建议使用批次插入序列。您遇到的问题是如何回收这些ID。 Oracle普通序列不会跟踪主键,因此您需要一个解决方案来首先查找循环密钥,然后回退到序列。
产品ID回收
- 批量插入 - 首次加载它们使用的密钥序列。对于这个小范围,在序列上设置NOCACHE以消除间隙。
- 删除 - 删除产品时,不是实际删除行,而是在该行上设置DELETED ='Y'标志。
- 插入 - 更新可用DELETED标志设置的第一条记录,或者从产品表中选择DELETED ='Y'的最小ID。更新与新产品的信息(但相同的ID)和集中删除=“N”
这可以确保您插入新的序列编号
如果要实现在数据库中的逻辑之前,你总是回收记录,您可以创建一个视图(VIEW $ PRODUCTS),其中DELETED ='N'和一个INSTEAD OF INSERT触发器来执行插入操作。
在任何情况下,当您用完序列(或序列包装)时,对于批量插入而言运气不佳。如果我是你,我会重新考虑设计的这一部分。
谢谢您的评论。 productID不是真正的主键:原因是我必须为1-65535范围内的每个人分配一个业务ID(出于商业原因)(然后,我将二进制文件中的此产品目录传输到无法处理的AVM高达16位最大产品ID)...目前我已经使用软删除,因为我需要跟踪历史记录,经过一段时间,我做了一个真正的删除...所以我无法使用您的解决方案。我想我需要有1到6535个有效的唯一产品ID。并且可能有相同标识的产品被标记为已停用... – Dypso 2014-10-31 10:39:56
1至6535 - 这是一个错字吗? – codenheim 2014-10-31 14:41:11
是的!那是在1到65535之间 – Dypso 2014-10-31 14:47:32
- 1. Oracle分区间隔2列间隔
- 2. 自动生成Oracle中所有表的序列和触发器
- 3. 随机的Cplex数发生器用一定的时间间隔
- 4. Oracle休眠序列生成器问题
- 5. Oracle间隔错误?
- 6. R生成1分钟的时间间隔序列
- 7. 线性序列发生器
- 8. perl序列号发生器
- 9. 创建Oracle序列触发器
- 10. Oracle序列没有生成
- 11. shell排序最快的间隔序列?
- 12. 如何将时间范围/时间间隔分为多个分箱间隔发生的时间间隔
- 13. 的Java序列发生器服务
- 14. Informix“序列化”Oracle数据库/序列/触发器Pro * C
- 15. 用于从序列中生成id的Oracle触发器的HIbernate问题
- 16. oracle adf如何在2列之间进行间隔?
- 17. 针对Oracle 11g的Grails序列生成
- 18. 随机间隔发生器对于设定的时间段内的实例数量
- 19. 以正确的时间间隔不发生事件c#定时器
- 20. 平均间隔10分钟的大型不规则间隔时间序列产生24小时配置文件
- 21. Oracle - 将序列值设置为触发器内表格的最大缩进值
- 22. javascript非序列随机数发生器
- 23. 如何创建序列号发生器?
- 24. 自然数字序列发生器
- 25. 从序列发生器开始
- 26. 序列发生器和用户类型
- 27. 特殊序列号发生器
- 28. sql在间隔中发生的总时间
- 29. 按发生次数分组的时间间隔
- 30. 试图在两个限制之间生成等间隔的数字序列
请发表一个例子。 – 2014-10-31 06:37:37
您确定要**重用产品ID **吗?从业务流程的角度来看,这几乎总是不是一个好主意 – 2014-10-31 06:38:27