oracle - 如何使用序列作为自动增量id?

Roc*_*ock 2 oracle

我有一个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;
Run Code Online (Sandbox Code Playgroud)

如果我使用数据库工具将20条记录插入表中,然后使用我的C#Web应用程序插入记录,则dog id将以1开头,而不是21.

任何人都可以帮我解决这个问题?

谢谢.

Grz*_*z W 7

序列不是"自动增量ID".

Sequence只是一个顺序唯一数字生成器.它可以作为您的Id列值提供程序,但它可以保持在列中保留适当的值.

我假设您添加了20行,如下所示:

insert into table(id, <columns>) values (1, <values>);
insert into table(id, <columns>) values (2, <values>);
and so on ...
Run Code Online (Sandbox Code Playgroud)

你的序列无法知道你所期望的下一个数字是什么(当然除非你(重新)用期望的初始值创建它).相反,您应该始终使用序列中的值,如下所示:

insert into table(id, <columns>) values (sequence.nextval, <values>);
insert into table(id, <columns>) values (sequence.nextval, <values>);
and so on ...
Run Code Online (Sandbox Code Playgroud)

这样,您将使序列与表ID值保持同步.

编辑:

您可以使用此答案中描述的触发器和序列来模仿该行为.

此外,IDENTITY列现在可在Oracle 12c上使用

  • 如果无法阅读你的思想是一个错误.好的. (9认同)