バージョン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;
/
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));
ここでは3つの味を紹介します。
RAW
データタイプ。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番目のものは内部で値を管理します。
SQL Serverのidentity列のような列を意味しているのでしょうか?
OracleではSEQUENCEを使って同じ機能を実現しています。 良いリンクを見つけて、ここに掲載します。
Update: ご自分で見つけられたようですね。 とりあえずリンクを貼っておきます。 http://www.techonthenet.com/oracle/sequences.php