IDENTITY列を含む行の挿入

キーワードDEFAULTがIDENTITY列のinsert_clauseとして使用されると、IDENTITY列の値が生成されます。GENERATED BY DEFAULTとGENERATED ALWAYSの両方のスタイルのIDENTITY列のINSERT文を示すいくつかの例を次に示します。

IDENTITYフィールドの作成方法は、値をINSERTするときの動作に影響します。主キーである列のIDENTITY値は変更できません。

例7-5 IDENTITYフィールドが主キーではない場合の、GENERATED ALWAYSのIDENTITYフィールドを持つ表の作成

CREATE Table Test_SGSqlInsert2(
    id INTEGER,
    name STRING,
    deptId INTEGER GENERATED ALWAYS AS IDENTITY (CACHE 1),
PRIMARY KEY(id))
INSERT INTO Test_SGSqlInsert2 VALUES (148, 'sally', DEFAULT)
INSERT INTO Test_SGSqlInsert2 VALUES (250, 'joe', DEFAULT)
INSERT INTO Test_SGSqlInsert2 VALUES (346, 'dave', DEFAULT)

上のINSERT文により、次の行が挿入されます。IDENTITY列deptIdに値1、2、および3が生成されます。

148, 'sally', 1
250, 'joe', 2
346, 'dave', 3
1つの文で将来参照するために生成されたdeptIdの値を取得するには、returning deptId句を次のように使用します。
INSERT INTO Test_SGSqlInsert2 VALUES (600, 'jabba', DEFAULT) returning deptId;
6
INSERT INTO Test_SGSqlInsert2 VALUES (700, 'bubba', DEFAULT) returning deptId;
7
次のINSERT文を使用すると、ユーザーがIDENTITY GENERATED ALWAYS列に値200を指定したため、例外が発生します。GENERATED BY DEFAULT AS IDENTITYとして定義するIDENTITYフィールドに値を指定することはできません。
INSERT INTO Test_SGSqlInsert2 VALUES (1, 'joe',
    200);
Error handling command INSERT INTO Test_SGSqlInsert2 VALUES (1, 'joe', 200): 
Error: at (1, 48) Generated always identity column must use DEFAULT construct.

例7-6 DeptID整数フィールド(GENERATED BY DEFAULT AS IDENTITY)を持つ表を作成し、主キーおよびシャード・キーとして設定する

CREATE TABLE Test_SGSqlInsert_Default (
   ID INTEGER,
   NAME STRING,
   DeptID INTEGER GENERATED BY DEFAULT AS IDENTITY (
   START WITH 1
   INCREMENT BY 1
   MAXVALUE 100),
   PRIMARY KEY (SHARD(DeptID), ID))
次の文は、表Test_SGSqlInsert_Defaultに値を挿入する方法を示しています。この場合、列IDがIDENTITYではないため、整数値をフィールドに割り当てることができます。
INSERT INTO Test_SGSqlInsert_Default VALUES (100, 'tim', DEFAULT)
INSERT INTO Test_SGSqlInsert_Default VALUES (200, 'dave', 210)
INSERT INTO Test_SGSqlInsert_Default VALUES (300, 'sam', 310)
INSERT INTO Test_SGSqlInsert_Default VALUES (400, 'Jennifer', DEFAULT)
INSERT INTO Test_SGSqlInsert_Default VALUES (500, 'Barbara', 2)
これらのサンプル文により、データベースに次の行が挿入されます。
300, 'sam', 310
100, 'tim', 1
400, 'Jennifer', 2
500, 'Barbara', 2
200, 'dave', 210

INSERT文で2つの値をDEFAULTとして指定したため、SGによってこれらが1および2として指定されます。他の値は指定したとおりに挿入されます(210310および2)。各値は、2つのDeptID値が同じになる場合でも受入れ可能です(DEFAULTから提供される2と、指定した値の2)。

IDENTITY列がGENERATED BY DEFAULT AS IDENTITYとして定義されているため、値を指定しない場合のみ、SGによって値が提供されます。値210310または2は正しい指定です。重複はチェックされず、GENERATED BY DEFAULT AS IDENTITY列の値が一意であることも強制されません。重複する値が存在しないことが要件である場合、これはアプリケーションによって確認されます。

例7-7 GENERATED BY DEFAULTを指定したIDENTITY列が主キーである表への行の挿入

CREATE TABLE Test_SGSqlInsert_Default_id (
    id INTEGER GENERATED BY DEFAULT AS IDENTITY,
    name STRING,
    deptId INTEGER,
PRIMARY KEY (id))
INSERT INTO Test_SGSqlInsert_Default_id VALUES (100, 'tim', 3)
INSERT INTO Test_SGSqlInsert_Default_id VALUES (DEFAULT, 'dave', 210)
INSERT INTO Test_SGSqlInsert_Default_id VALUES (300, 'sam', 310)
INSERT INTO Test_SGSqlInsert_Default_id VALUES (500, 'Jennifer', 410)
INSERT INTO Test_SGSqlInsert_Default_id (name,deptId) VALUES ("Abby", 510)

上の文により、データベースに次の行が挿入されます。主キー・フィールド(id)がIDENTITY列として定義されているため、idフィールドにDEFAULTを指定すると、SGによってid値が自動生成されます。同様に、nameおよびdeptIDフィールド値のみを指定する最後のinsert文では、SGによってid値が自動生成されます。

{"id":2,"name":"Abby","deptId":4}
{"id":300,"name":"sam","deptId":310}
{"id":100,"name":"tim","deptId":3}
{"id":1,"name":"dave","deptId":210}
{"id":500,"name":"Jennifer","deptId":410}