我有一个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.
任何人都可以帮我解决这个问题?
谢谢.
序列不是"自动增量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上使用
| 归档时间: |
|
| 查看次数: |
22301 次 |
| 最近记录: |