IDENTITY列を含む行の挿入
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
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
として指定されます。他の値は指定したとおりに挿入されます(210
、310
および2
)。各値は、2つのDeptID
値が同じになる場合でも受入れ可能です(DEFAULT
から提供される2
と、指定した値の2
)。
IDENTITY列がGENERATED BY DEFAULT AS IDENTITY
として定義されているため、値を指定しない場合のみ、SGによって値が提供されます。値210
、310
または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}