SQL CLIからのIDENTITY値の挿入
DDL文およびAPIコールを使用して、GENERATED ALWAYSまたはGENERATED BY DEFAULTのどちらで指定したかに関係なく、値をIDENTITYフィールドに挿入できます。
作成する各IDENTITYフィールドでは、次のいずれかの構文が使用されます。
- GENERATED ALWAYS AS IDENTITY
- GENERATED BY DEFAULT AS IDENTITY
- GENERATED BY DEFAULT ON NULL AS IDENTITY
たとえば、IDENTITYフィールドがGENERATED ALWAYSである次の表を作成します。IDENTITYフィールドは主キーではありません。
sql-> CREATE Table Test_SGSqlInsert2(
id INTEGER,
name STRING,
deptId INTEGER GENERATED ALWAYS AS IDENTITY (CACHE 1),
PRIMARY KEY(id));
Statement completed successfully
この表に値を正常に挿入するには、
deptID IDENTITY
フィールドの値としてDEFAULT
を常に指定して、SGが次の値を生成するようにします。
sql->
> INSERT INTO Test_SGSqlInsert2 VALUES (148, 'sally', DEFAULT);
> INSERT INTO Test_SGSqlInsert2 VALUES (250, 'joe', DEFAULT);
> INSERT INTO Test_SGSqlInsert2 VALUES (346, 'dave', DEFAULT);
{"NumRowsInserted":1}
1 row returned
{"NumRowsInserted":1}
1 row returned
{"NumRowsInserted":1}
1 row returned
前の
INSERT
文によって次の行が追加され、DEFAULT
を指定するたびに、SGが次に使用可能なIDENTITY値を取得します。
sql-> select * from Test_SGSqlInsert2;
{"id":148,"name":"sally","deptId":1}
{"id":250,"name":"joe","deptId":2}
{"id":346,"name":"dave","deptId":3}
3 rows returned
1つの文で将来参照するために生成された
deptId
の値を取得するには、returning deptId
句を次のように使用します。
INSERT INTO Test_SGSqlInsert2 VALUES (600, 'jabba', DEFAULT) returning deptId;
{"deptId":6}
INSERT INTO Test_SGSqlInsert2 VALUES (700, 'bubba', DEFAULT) returning deptId;
{"deptId":7}
次の
INSERT
文を使用して、DEFAULT
ではなく値を指定すると、例外が発生します。GENERATED BY DEFAULT AS IDENTITY
として定義するIDENTITYフィールドに値を指定することはできません。
sql-> 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.
別の例として、
DeptID
整数フィールド(GENERATED BY DEFAULT AS IDENTITY
)を持つ表を作成し、このフィールドを主キーおよびシャード・キーにします。
sql-> 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));
Statement completed successfully
次の文は、表
Test_SGSqlInsert_Default
に値を挿入する方法を示しています。この場合、列IDがIDENTITYではないため、整数値をフィールドに割り当てることができます。
sql->
> 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);
{"NumRowsInserted":1}
1 row returned
{"NumRowsInserted":1}
1 row returned
{"NumRowsInserted":1}
1 row returned
{"NumRowsInserted":1}
1 row returned
{"NumRowsInserted":1}
1 row returned
これらのサンプル文により、データベースに次の行が挿入されます。
sql-> select * from Test_SGSqlInsert_Default;
{"ID":300,"NAME":"sam","DeptID":310}
{"ID":100,"NAME":"tim","DeptID":1}
{"ID":400,"NAME":"Jennifer","DeptID":2}
{"ID":500,"NAME":"Barbara","DeptID":2}
{"ID":200,"NAME":"dave","DeptID":210}
5 rows returned
INSERT
文で2つの値をDEFAULT
として指定したため、SGによってこれらが1
および2として指定されます。他の値は指定したとおりに挿入されます(210
、310
および2
)。各値は、2つのDeptID
値が同じになる場合でも受入れ可能です(DEFAULT
から提供される2
と、指定した値の2
)。
IDENTITY列が
GENERATED BY DEFAULT AS IDENTITY
として定義されているため、値を指定しない場合のみ、SGによって値が提供されます。値210
、310
または2
は正しい指定です。重複はチェックされず、GENERATED BY DEFAULT AS IDENTITY
列の値が一意であることも強制されません。重複する値が存在しないことが要件である場合、これはアプリケーションによって確認されます。