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

标签 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;

如果我使用数据库工具向表中插入 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/

相关文章:

oracle - 为什么 Oracle varchar2 有一个强制大小作为定义参数?

oracle - 如何检查表中是否有带有主键值的记录?

database - Oracle:提取图形数据库表示

sql - first_value() over (order by something asc) 应该与 last_value () over (order by something desc) 相同吗?

oracle - 如何在Toad中调试存储过程?

oracle - 如何编译 ORACLE 触发器

sql - 我可以在同一个查询结果(oracle)中返回多个计数器吗?

oracle - 将 PL/SQL 脚本转换为存储过程

sql - oracle执行计划,试图理解

oracle - 我可以使用 Oracle 触发器来强制 varchar 列适应列宽吗?