0

我处于使用 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 的新最大值,这会解决问题吗?对现有数据有影响吗?对于这个问题的新手性质,我深表歉意,但我对此相对较新,并且没有任何技术人员可以为我提供支持。我提前感谢大家。

4

2 回答 2

2

您无法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;
于 2021-08-25T17:18:40.740 回答
0

由于您提到的原因,我从来没有习惯使用序列号作为主键。

我更喜欢使用与每个表关联的 IDENTITY 列,这样您就可以唯一地标识一行。此外,这在您的表中少了一个对象。

create table t1(
      seq_num integer  GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
….
….

使用 IDENTITY 列创建一个临时表。使用 SELECT 加载它并重命名表。您将永远不会再遇到问题。

展望新表,您可能希望合并此功能。祝你好运

于 2021-08-25T19:15:19.940 回答