如何在Oracle上用AUTO_INCREMENT创建ID?

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

我怎样才能在Oracle 11g中创建一个行为类似于自动增量的列?

解决办法

在Oracle中没有"自动递增"或"身份"列这样的东西,到Oracle 11g为止。然而,你可以用一个序列和一个触发器轻松地建立模型。

表的定义。

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

UPDATE:

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));
评论(8)

这里有三种味道。

  1. 数字式。 简单的递增的数字值,例如1,2,3,....
  2. GUID. 全局通用的标识符,作为`RAW'数据类型。
    1. GUID(字符串)。 与上述相同,但作为一个字符串,在某些语言中可能更容易处理。

x是身份列。 在每个例子中用你的表名代替FOO

-- numerical identity, e.g. 1,2,3...
create table FOO (
    x number primary key
);
create sequence  FOO_seq;

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select FOO_seq.nextval into :new.x from dual;
end;
/

-- GUID identity, e.g. 7CFF0C304187716EE040488AA1F9749A
-- use the commented out lines if you prefer RAW over VARCHAR2.
create table FOO (
    x varchar(32) primary key        -- string version
    -- x raw(32) primary key         -- raw version
);

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select cast(sys_guid() as varchar2(32)) into :new.x from dual;  -- string version
  -- select sys_guid() into :new.x from dual;                     -- raw version
end;
/

更新。

Oracle 12c引入了这两个不依赖触发器的变体。

create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);

第一种是以传统方式使用序列;第二种是内部管理值。

评论(0)

假设你指的是像SQL Server身份栏那样的列?

在Oracle中,你用一个SEQUENCE来实现同样的功能。 我看看能不能找到一个好的链接并把它贴在这里。

更新:看起来你自己找到了。 下面是链接。 http://www.techonthenet.com/oracle/sequences.php

评论(0)