INSERT文
構文
insert_statement ::=
[variable_declaration
]
INSERT INTO table_name
[[AS] table_alias
]
["(" id
("," id)* ")"]
VALUES "(" insert_clause ("," insert_clause)* ")"
[SET TTL ttl_clause
]
[returning_clause]
insert_clause ::= DEFAULT | expression
returning_clause ::= RETURNING select_list
セマンティクス
行がまだ存在しない場合のみ挿入されます。
Insert文は、その文の残りの部分で使用される外部変数の宣言から開始できます。変数の宣言を参照してください。ただし、問合せとは異なり、外部変数は宣言せずに挿入で使用できます。これは、問合せの最適化が行われないため、挿入ではデータの問合せを行わず、外部変数のタイプを事前に知ることは重要ではないためです。
表名の後にオプションの列を指定できます。このリストには、表の列のサブセットの列名が含まれます。このサブセットには、すべての主キー列が含まれている必要があります。列リストが存在しない場合、デフォルトの列リストは、表のすべての列がCREATE TABLE文の項で指定された順序で含まれる列リストです。
列リストの列は、VALUES句の後にリストされた式(またはDEFAULTキーワード)に1対1で対応します(式/DEFAULTの数が列数と一致しない場合はエラーが発生します)。これらの式/DEFAULTによって、新しい行の関連する列の値が計算されます。具体的には、各式が評価され、その戻り値が関連する列のタイプにキャストされます。CASTは、CAST式の項の説明に従ってCAST式のように動作します。式が複数の項目を返す場合は、エラーが発生します。式で結果が返されない場合は、NULLがその式の結果として使用されます。式ではなく、DEFAULTキーワードがVALUESリストに表示される場合は、関連付けられた列のデフォルト値が、新しい行のその列の値として使用されます。デフォルト値は、列リストの列の数が表の列の合計数より少ない場合、欠落している列にも使用されます。
VALUESリストの式は、問合せ文とは異なり、外部変数を参照する場合があります。宣言セクションで宣言する必要はありません。
VALUESリストの後にSET TTL句を使用すると、新しい行の有効期限を設定できます。CREATE TABLE文の項で説明しているように、すべての行に有効期限があります。有効期限は無限の場合があり、存続時間(TTL)の値を日数または時間数で指定したものとして計算されます。具体的には、N時間/日のTTL値で、Nが0より大きい場合、有効期限は現在の時間(UTC)にN時間/日を加えた時間として計算され、次の満時間/日に丸められます。たとえば、現在の時間が2017-06-01T10:05:30.0でNが3時間の場合、有効期限は2017-06-01T14:00:00.0になります。Nが0の場合、有効期限は無限です。
構文に示すように、SET TTL句には2つのフレーバがあります。USING TABLE DEFAULT構文を使用すると、TTL値は、CREATE TABLE文で指定した表のデフォルトのTTLに設定されます。それ以外の場合は、新しいTTL値を計算する式がSET TTLに含まれます。この式の結果が空の場合、表のデフォルトのTTLが使用されます。それ以外の場合、式は整数Nにキャストする単一の数値項目を返す必要があります。Nが負の場合は、0に設定されます。TTL式の右側で、キーワードHOURSまたはDAYSを使用してNが時間数と日数のどちらであるかを指定する必要があります。
挿入文にSET TTL句が含まれる場合は、前述の説明に従って有効期限が計算され、挿入される行に適用されます。SET TTL句が使用されない場合は、デフォルトの表のTTLを使用して挿入された行の有効期限が計算されます。MR表の場合、この行が他のリージョンにレプリケートされると、その有効期限も絶対タイムスタンプ値としてレプリケートされます。したがって、レプリケートされた行は、レプリケートされた時期に関係なく、元の行とともに期限切れになります。TTL値を持つ同じ行が複数のリージョンに挿入される場合、TTL値はすべてのリージョンで、書込みタイムスタンプが最も大きい行に保持されている値に設定されます。
挿入文の最後の部分はRETURNING句です。存在しない場合、更新文の結果は、NumRowsInsertedという名前で、その値が挿入された行数(行がすでに存在する場合は0、それ以外の場合は1)である1つのフィールドを含むレコードです。それ以外の場合、RETURNING句は、SELECT句と同じように機能します。その場合、"*"を指定することもでき、行全体が返されます。または、返す必要がある内容を指定する式のリストを含めることができます。挿入が実際に行われない(行がすでに存在するため) INSERTの場合、RETURNING句は既存の行に影響を与えます。それ以外の場合、RETURNING句は新しい行に影響を与えます。
例1: データの挿入時のDEFAULT値の使用
INSERT INTO users VALUES (
10,
"John",
"Smith",
[ {"first" : "Johny", "last" : "BeGood"} ],
22,
45000,
{ "street" : "Main", "number" : 10, "city" : "Reno", "state" : "NV"},
[ 30, 55, 43 ],
DEFAULT
);
例2: INSERT文でのRETURNING句の使用
INSERT INTO users VALUES (
20,
"Mary",
"Ann",
null,
43,
90000,
{ "street" : "Main", "number" : 89, "city" : "San Jose", "state" : "CA"},
null,
DEFAULT
) RETURNING *;
{"id":20,"firstName":"Mary","lastName":"Ann","otherNames":null,
"age":43,"income":90000,"address":{"city":"San Jose","number":89,
"state":"CA","street":"Main"},"connections":null,"expenses":null}
例3: 行の挿入時の行のTTLの設定
INSERT INTO users VALUES (
30,
"Peter",
"Paul",
null,
25,
53000,
{ "street" : "Main", "number" : 3, "city" : "Fresno", "state" : "CA"},
null,
DEFAULT
)SET TTL 2 days;
{"NumRowsInserted":1}
子表へのデータの挿入:
子表は、親表の主キー列を継承します。これは暗黙的に行われ、子のCREATE TABLE文に親列が含まれることはありません。したがって、子表には、親表の主キーに関連する列が追加で含まれています。子表へのデータの挿入中に、親表の主キーの値も挿入されます。
userdet
の説明を次に示します。sql-> desc as json table users.userdet;
{
"json_version" : 1,
"type" : "table",
"name" : "userdet",
"parent" : "users",
"regions" : {
"2" : "FRA",
"1" : "LON"
},
"fields" : [{
"name" : "id",
"type" : "INTEGER",
"nullable" : false
}, {
"name" : "pan",
"type" : "INTEGER",
"nullable" : false
}, {
"name" : "address",
"type" : "STRING",
"nullable" : true
}, {
"name" : "email",
"type" : "STRING",
"nullable" : true
}],
"primaryKey" : ["id", "pan"],
"shardKey" : ["id"]
}
insert into users.userdet values(1,100,"bangalore","test@one.com");
{"NumRowsInserted":1}
SELECT * FROM users.userdet;
{"id":1,"pan":100,"address":"bangalore","email":"test@one.com"}