Oracleに関して、シーケンス(sequence)を使って自動発番を実現する際のメモ。
MySQLではオートインクリメント(AUTO_INCREMENT)を設定するだけですけど、Oracleにはオートインクリメントなんていう設定は無いので別の方法で実現します。
自動発番をする方法
サンプルデータ
サンプルとして以下のようなテーブルに使って説明します。
SQL> SELECT * FROM M_USER;
+--------------+--------------+--------------+
|ID |NAME |AGE |
+--------------+--------------+--------------+
|1 |TARO |19 |
+--------------+--------------+--------------+
|2 |JIRO |23 |
+--------------+--------------+--------------+
|3 |HANAKO |38 |
+--------------+--------------+--------------+
M_USERのIDに対して自動発番の設定をしていきます。
実現するためにはシーケンス(sequence)とトリガー(trigger)を作成する必要があります。
シーケンスとは、一意な連番の値を発番することができる仕組みのことを言います。
またトリガーとは、特定の条件が満たされた際に処理が実行される仕組みのことを言います。
シーケンスでIDの現時点の番号を保持し、トリガーによってデータのINSERT時にシーケンスの値を1カウントまわして、IDにセットする流れになります。
シーケンス(sequence)の作成
まず、M_USER用のシーケンスを作成します。
/*
構文
CREATE SEQUENCE <シーケンス名>
MINVALUE <最小値>
MAXVALUE <最大値>
INCREMENT BY <増加値>
START WITH <初期値> ;
*/
-- 実行例
SQL> CREATE SEQUENCE M_USER_SEQ MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 1 CACHE 10 NOORDER NOCYCLE;
- MINVALUE 1 :シーケンスの最小値を設置
- MAXVALUE 9999999999 :シーケンスの最大値を設定
- INCREMENT BY 1 :増加値を設定
- START WITH 1 :シーケンスの開始位置
- CACHE 10 :メモリ上に予め領域を確保するか
- NOORDER :発番順に値が並ぶ事を保証しない(保証する場合はORDER)
- NOCYCLE :シーケンスの値が最大値になった場合初期に戻るかどうか(戻る場合はCYCLE)
リガー(trigger)の作成
次にトリガーを作成していきます。事前にシーケンスを作成した後でないとエラーにあるので注意してください。
/*
構文
CREATE (OR REPLACE) TRIGGER <トリガー名>
BEFORE INSERT ON <テーブル名>
FOR EACH ROW
BEGIN
<トリガー発動時の処理>
END;
*/
-- 実行例
SQL> CREATE OR REPLACE TRIGGER M_USER_TRIGGER BEFORE INSERT ON M_USER FOR EACH ROW
BEGIN
SELECT M_USER_SEQ.nextval INTO :new.id FROM dual;
END;
/
補足
- CREATE OR REPLACE :トリガーなければ新規作成し、存在していれば上書きする
- BEFORE INSERT :データがINSERTされる前にトリガーが発動する
- FOR EACH ROW :複数行に対して操作があった場合トリガーが発動する
自動発番の確認
これで自動発番するための準備は完了しました。
試しに新規データをINSERTしてみましょう!
SQL> INSERT INTO M_USER(NAME, AGE) VALUES('SABURO',30);
+--------------+--------------+--------------+
|ID |NAME |AGE |
+--------------+--------------+--------------+
|1 |TARO |19 |
+--------------+--------------+--------------+
|2 |JIRO |23 |
+--------------+--------------+--------------+
|3 |HANAKO |38 |
+--------------+--------------+--------------+
|4 |SABURO |30 |
+--------------+--------------+--------------+
INSERT文にはIDは指定していませんが、自動でID(=4)が発番されているのが分かると思います。