如何在Oracle上使用AUTO_INCREMENT创建ID? [英] How to create id with AUTO_INCREMENT on Oracle?

查看:125
本文介绍了如何在Oracle上使用AUTO_INCREMENT创建ID?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

直到11g版本(包括11g),Oracle中似乎都没有AUTO_INCREMENT的概念.

It appears that there is no concept of AUTO_INCREMENT in Oracle, up until and including version 11g.

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

How can I create a column that behaves like auto increment in Oracle 11g?

推荐答案

从Oracle 11g 开始,Oracle 中没有"auto_increment"或"identity"列之类的东西.但是,您可以使用序列和触发器轻松对其进行建模:

There is no such thing as "auto_increment" or "identity" columns in Oracle as of Oracle 11g. However, you can model it easily with a sequence and a trigger:

表定义:

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;
/

更新:

现在在Oracle 12c上可以使用

IDENTITY 列:

UPDATE:

IDENTITY column is now available on Oracle 12c:

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

或指定起始值和增量值,还可以防止将任何插入标识列(GENERATED ALWAYS)(同样,仅适用于Oracle 12c +)

or specify starting and increment values, also preventing any insert into the identity column (GENERATED ALWAYS) (again, Oracle 12c+ only)

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

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

Alternatively, Oracle 12 also allows to use a sequence as a default value:

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));

这篇关于如何在Oracle上使用AUTO_INCREMENT创建ID?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆