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です。
これは、簡単に言えばユニークな値を自動的に生成してくれる列のことです。
テーブル作成時に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です。
コメント