これがOracleの標準機能ではないことに多くの人が不満を抱きますが、CREATE TABLEコマンドの後にさらに2つのコマンドを追加するだけの簡単な場合、すべての挿入で派手なSQLを使用する正当な理由がわかりません。遊んでください。
SQL> CREATE TABLE test
(id NUMBER PRIMARY KEY,
name VARCHAR2(30));
Table created.
ここで、IDを自動インクリメントフィールドにすることを想定します。まず、値を取得するためのシーケンスが必要です。
SQL> CREATE SEQUENCE test_sequence
START WITH 1
INCREMENT BY 1;
Sequence created.
これで、テーブルのBEFOREINSERTトリガーでそのシーケンスを使用できます。
CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT
ON test
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT test_sequence.nextval INTO :NEW.ID FROM dual;
END;
/
SQL> INSERT INTO test (name) VALUES ('Jon');
1 row created.
SQL> INSERT INTO test (name) VALUES (’Bork’);
1 row created.
SQL> INSERT INTO test (name) VALUES (’Matt’);
1 row created.
SQL> SELECT * FROM test;
ID NAME
———- ——————————
1 Jon
2 Bork
3 Matt