oracle - 更改 Oracle 序列对现有数据的影响,特别是“START WITH”值
问题描述
我处于使用 Oracle 数据库的情况。我们数据库中的一个表不完整,另一个分支正在 Excel 电子表格中跟踪他们的数据。在重新格式化他们的数据后,我能够成功地将数据附加到 Oracle 表中。为了实现这一点,我必须采取的步骤之一是手动分配新的 DISPOSAL_ID(这个特定表的主键)。我的方法是简单地为该表取 DISPOSAL_ID 的最大值,并为我希望附加的每条新记录加一。
现在的问题是,最终用户报告她尝试将新记录输入到该表中,她收到来自 Oracle APEX 应用程序的错误消息:ORA - 00001:违反了唯一约束 (table_name.PK)。
我怀疑这与为该表生成主键的 Oracle 序列产生的值有关,这些值是我在将分支数据附加到表时手动分配的。
我应该怎么做才能更新以更新序列?当前序列定义为:CREATE SEQUENCE "MP_DISPOSAL_EVENTS_SEQ1" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 861 CACHE 20 NOORDER NOCYCLE NOPARTITION /
如果我将 'START WITH' 值替换为 DISPOSAL_ID 的新最大值,这会解决问题吗?对现有数据有影响吗?对于这个问题的新手性质,我深表歉意,但我对此相对较新,并且没有任何技术人员可以为我提供支持。我提前感谢大家。
解决方案
您无法alter sequence
更改起始值。您可以使用新的起始值删除并重新创建序列。这样做的主要缺点是,如果序列上有任何授权,这些授权将丢失并且需要重新授权。
通常最好更改增量,获取nextval
序列的,然后将增量设置回 1。因此,例如,如果您向表中添加了 150 个新行
alter sequence MP_DISPOSAL_EVENTS_SEQ1 increment by 150;
select MP_DISPOSAL_EVENTS_SEQ1.nextval from dual
alter sequence MP_DISPOSAL_EVENTS_SEQ1 increment by 1;
推荐阅读
- python - 返回小于等于日期的最近外键的子查询
- flutter - 未处理的异常 ScrollController 未附加到任何滚动视图
- java - 内存中的非序列化对象会发生什么?
- java - 如何在fire base android中同时在一个节点的两个子节点上写入数据?
- model-view-controller - 如何在 Joomla 的前端部分使用编辑和保存按钮创建列表视图!3 成分?
- c# - 如何在 C# 中调用/编组 C++“const uint64_t*”?
- javascript - 获取销售日期可变产品 woo
- typescript - 为什么 TypeScript 接口中存在的属性会通过断言影响类型缩小,我怎样才能让它正常工作?
- vue.js - 在Vue中使用put请求编辑数组中的数组
- r - R 矢量化和 dplyr 变异错误?