2

我有一个 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。

任何人都可以帮我修复这个错误吗?

谢谢。

4

3 回答 3

7

序列不是“自动增量 ID”。

Sequence 只是一个顺序唯一的数字生成器。它可以作为您的 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 值同步。

编辑 :

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

Oracle 12c 现在还提供 IDENTITY 列

于 2012-12-10T10:38:29.207 回答
0

如果你想从 20 而不是 1 开始,你需要改变你的顺序。

CREATE SEQUENCE "DOGINFO_SEQ" MINVALUE 20 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 20 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 "DOGINFO_SEQ".nextval INTO :NEW."Id" FROM dual;
END;
于 2014-09-16T09:14:52.610 回答
-1

我觉得你用错了Seq name

而不是使用DOGINFO_SEQuse USERINFO_SEQ

于 2015-02-18T06:45:50.297 回答