OracleでAUTO_INCREMENTのIDを作成するには?

バージョン11gまでのOracleには、AUTO_INCREMENTの概念がないようです。

Oracle 11gでオートインクリメントのような動作をするカラムを作成するにはどうしたらよいでしょうか。

ソリューション

Oracle 11g*では、"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;
/

UPDATE:

Oracle 12cでIDENTITYカラムが利用できるようになりました。

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

または、開始値と増加値を指定して、IDカラムへの挿入を防止する(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)

ここでは3つの味を紹介します。

    1. 数字。 1,2,3,.... のように、単純な数値の増加。
  1. GUID. 世界的に統一された識別子で、RAWデータタイプ。
    1. GUID(文字列). 3. GUID (string). 上記と同じだが、言語によっては扱いやすい文字列である。

xはIDカラムです。 以下の例では、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では、トリガーに依存しない以下の2つのバリアントが導入されています。

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

最初のものは伝統的な方法でシーケンスを使用し、2番目のものは内部で値を管理します。

解説 (0)

SQL Serverのidentity列のような列を意味しているのでしょうか?

OracleではSEQUENCEを使って同じ機能を実現しています。 良いリンクを見つけて、ここに掲載します。

Update: ご自分で見つけられたようですね。 とりあえずリンクを貼っておきます。 http://www.techonthenet.com/oracle/sequences.php

解説 (0)