如何在 Oracle 上使用 AUTO_INCREMENT 创建 id?

新手上路,请多包涵

在 Oracle 中似乎没有 AUTO_INCREMENT 的概念,直到并包括版本 11g。

如何在 Oracle 11g 中创建一个行为类似于自动增量的列?

原文由 Sushan Ghimire 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 558
2 个回答

从 Oracle 11g 开始, Oracle 中没有“auto_increment”或“identity”列这样的东西。但是,您可以使用序列和触发器轻松建模:

表定义:

 CREATE TABLE departments (
  ID           NUMBER(10)    NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

CREATE SEQUENCE dept_seq START WITH 1;

触发器定义:

 CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW

BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/

更新:

IDENTITY 列现在在 Oracle 12c 上可用:

 create table t1 (
    c1 NUMBER GENERATED by default on null as IDENTITY,
    c2 VARCHAR2(10)
    );

或指定起始值和增量值,同时防止任何插入标识列( GENERATED ALWAYS )(同样,仅限 Oracle 12c+)

 create table t1 (
    c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
    c2 VARCHAR2(10)
    );

或者,Oracle 12 还允许使用序列作为默认值:

 CREATE SEQUENCE dept_seq START WITH 1;

CREATE TABLE departments (
  ID           NUMBER(10)    DEFAULT dept_seq.nextval NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

原文由 Eugenio Cuevas 发布,翻译遵循 CC BY-SA 4.0 许可协议

创建序列:

 CREATE SEQUENCE SEQ_CM_LC_FINAL_STATUS
MINVALUE 1 MAXVALUE 999999999999999999999999999
INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE;

添加触发器

CREATE OR REPLACE TRIGGER CM_LC_FINAL_STATUS_TRIGGER
BEFORE INSERT
ON CM_LC_FINAL_STATUS
FOR EACH ROW
BEGIN
:NEW.LC_FINAL_STATUS_NO := SEQ_CM_LC_FINAL_STATUS.NEXTVAL;
END;

第一步是在您的数据库中创建一个 SEQUENCE,这是一个数据对象,多个用户可以访问以自动生成递增值。如文档中所述,Oracle 中的序列可防止同时创建重复值,因为在生成每个序列项之前,多个用户实际上被迫“轮流”。 –

最后,我们将创建我们的 SEQUENCE,稍后将使用它来实际生成唯一的、自动递增的值。 –

虽然我们已经创建了表并准备就绪,但到目前为止,我们的序列只是坐在那里,但从未投入使用。这就是 TRIGGERS 的用武之地。与现代编程语言中的事件类似,Oracle 中的 TRIGGER 是在特定事件发生时执行的存储过程。通常,TRIGGER 将配置为在更新表或删除记录时触发,在必要时提供一些清理。 –

在我们的例子中,我们希望在 INSERT 之前执行我们的 TRIGGER 到我们的 CM_LC_FINAL_STATUS 表中,确保我们的 SEQUENCE 递增并且新值被传递到我们的主键列。

原文由 Mohammad Ali Abdullah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进