oracle 12cの新機能にIdentity Columnという機能があります。
これは、簡単に言えばユニークな値を自動的に生成してくれる列のことです。
テーブル作成時にIdentity Columnの列を設定することが出来ます。
なお、Identity Columnの列を作成した場合、裏ではシークエンスが作成されています。
1回目の記事で大まかな機能を確認し、2回目の記事でシークエンスの動きを確認してみます。

SQL> CREATE TABLE identity_test_tab (
  2  id NUMBER GENERATED ALWAYS AS IDENTITY,
  3  description VARCHAR2(30)
  4  );

表が作成されました。


表を作成します。
id列の「GENERATED ALWAYS AS IDENTITY」でIdentity Columnを指定しています。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description2');

1行が作成されました。


id列を明示的に指定せずにinsertします。


SQL> SELECT * FROM identity_test_tab;

        ID DESCRIPTION
---------- ------------------------------
         1 Just Description
         2 Just Description2

id列にはユニークな値、1、2・・・設定されています。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (5,'Just Description');
INSERT INTO identity_test_tab (id,description) VALUES (5,'Just Description')
                               *
行1でエラーが発生しました。:
ORA-32795: GENERATED ALWAYSで作成されたアイデンティティ列には挿入できません

SQL> INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description');
INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description')
                               *
行1でエラーが発生しました。:
ORA-32795: GENERATED ALWAYSで作成されたアイデンティティ列には挿入できません


明示的に値を指定した場合、NULL値を指定した場合、エラーが発生します。

SQL> DROP TABLE identity_test_tab;

表が削除されました。


CREATE TABLE identity_test_tab (
id NUMBER GENERATED BY DEFAULT AS IDENTITY,
description VARCHAR2(30)
);

表が作成されました。


次に別オプションの「GENERATED BY DEFAULT AS IDENTITY」で表を作成してみます。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description2');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description');

1行が作成されました。

SQL> SELECT * FROM identity_test_tab;

        ID DESCRIPTION
---------- ------------------------------
         1 Just Description2
         2 Just Description


この設定の場合はid列は未指定→OK

SQL> INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description');
INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description')
                                                       *
行1でエラーが発生しました。:
ORA-01400: ("TEST"."IDENTITY_TEST_TAB"."ID")にはNULLは挿入できません。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (1,'Just Description');

1行が作成されました。


id列に明示的に値を指定する→OK、NULL値を指定する→NGと言った設定になります。

QL> DROP TABLE identity_test_tab;

表が削除されました。

SQL> CREATE TABLE identity_test_tab (
  2  id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  3  description VARCHAR2(30)
  4  );

表が作成されました。


「GENERATED BY DEFAULT ON NULL AS IDENTITY」で列を作成した場合

SQL> INSERT INTO identity_test_tab (description) VALUES ('Just Description');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (2,'Just Description');

1行が作成されました。

SQL> INSERT INTO identity_test_tab (id,description) VALUES (NULL,'Just Description');

1行が作成されました。

SQL> SELECT * FROM identity_test_tab;

        ID DESCRIPTION
---------- ------------------------------
         1 Just Description
         2 Just Description
         2 Just Description


id値は未指定、明示的に値を指定、NULL値を指定(「id値は未指定」と同じ結果)、ともにOKです。