我有一个oracle数据库表:
CREATE TABLE "DogInfo" (
"Id" NUMBER NOT NULL ENABLE,
"DogName" VARCHAR2 (50 CHAR) NOT NULL ENABLE,
"DogAge" NUMBER NOT NULL ENABLE,
CONSTRAINT "DogInfo_PK" PRIMARY KEY ("Id") ENABLE
);
CREATE SEQUENCE "DOGINFO_SEQ" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE;
CREATE OR REPLACE TRIGGER "BI_DogInfo"
BEFORE INSERT ON "DogInfo" FOR EACH ROW
WHEN (NEW."Id" IS NULL OR NEW."Id" = 0) BEGIN
SELECT "USERINFO_SEQ".nextval INTO :NEW."Id" FROM dual;
END;
ALTER TRIGGER "BI_DogInfo" ENABLE;
如果我使用数据库工具向表中插入 20 条记录,然后使用我的 C# Web 应用程序插入记录,狗 id 将以 1 开头,而不是 21。
谁能帮我修复这个错误?
谢谢。
最佳答案
序列不是“自动递增 ID”。
序列只是一个连续的唯一数字生成器。它可以作为您的 Id 列值提供程序,但您需要在列中保留正确的值。
我假设您像这样添加 20 行:
insert into table(id, <columns>) values (1, <values>);
insert into table(id, <columns>) values (2, <values>);
and so on ...
您的序列无法知道您“期望”它具有的下一个数字是什么(当然,除非您使用所需的初始值(重新)创建它)。 相反,您应该始终使用序列中的值,如下所示:
insert into table(id, <columns>) values (sequence.nextval, <values>);
insert into table(id, <columns>) values (sequence.nextval, <values>);
and so on ...
这样您就可以使序列与表 ID 值保持同步。
编辑:
您可以使用触发器和序列来模仿该行为,如 this answer 中所述。 .
IDENTITY 列现在在 Oracle 12c 上可用
关于oracle - 如何使用序列作为自动增量ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13799005/