LindormTable のデータを更新するには、UPDATE
構文を使用できます。このトピックでは、UPDATE
構文と使用上の注意事項について説明します。
適用可能なエンジンとバージョン
UPDATE
構文は LindormTable にのみ適用されます。UPDATE
構文は、LindormTable 2.3.2 以後でサポートされています。 LindormTable のバージョンを表示またはアップグレードする方法については、「LindormTable のリリースノート」および「Lindorm インスタンスのマイナーエンジンバージョンをアップグレードする」をご参照ください。
構文
update_statement ::= UPDATE [hint_clause] table_identifier
SET column_identifier = value (',' column_identifier = value ) *
WHERE where_clause
where_clause ::= relation ( AND|OR relation )*
relation ::= column_name operator term
| '(' column_name ( ',' column_name )* ')' operator tuple_literal
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | IS NOT? NULL | LIKE
制限事項
UPDATE 構文を使用してプライマリキーを更新することはできません。
単一行の原子性は保証されません。フィールドの値のインクリメントなど、インクリメント操作の実行中にエラーが発生し、再試行が必要な場合、繰り返しの計算により結果が不正確になる可能性があります。
行をまたがるトランザクションはサポートされていません。
UPDATE
文を実行して複数の行のデータを変更するときにエラーが発生した場合、一部の行のデータは更新される可能性がありますが、他の行のデータは更新に失敗する可能性があります。説明式を使用して非プライマリキー列のデータを更新する場合は、1 行のデータを更新し、すべてのプライマリキーを指定して、更新する行をすばやく特定することをお勧めします。たとえば、このトピックの特定の列の値が増分されるを参照してください。
スカラー更新を実行する場合(たとえば、更新句が
c1=1
の場合)で、一部の行のデータの更新に失敗した場合は、更新操作を再実行してください。
例
次のサンプルコードは、テーブルを作成してデータの行を挿入する方法の例を示しています。
-- sensor という名前のテーブルを作成します。
CREATE TABLE sensor (
p1 INTEGER NOT NULL,
c1 INTEGER,
c2 VARCHAR,
c3 VARCHAR,
PRIMARY KEY(p1)
);
-- データの行を挿入します。
UPSERT INTO sensor(p1, c1, c2, c3) VALUES(1,1,'a','a');
サンプル結果:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | a | a |
+----+----+----+----+
プライマリキーに基づいてデータを更新する
UPDATE sensor SET c2='b' WHERE p1=1;
結果を確認する
SELECT * FROM sensor;
文を実行して、データが更新されたかどうかを確認できます。サンプル結果:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | b | a |
+----+----+----+----+
非プライマリキーに基づいてデータを更新する
LindormTable のバージョンは 2.7.6 以後である必要があります。現在のバージョンを表示し、コンソールで LindormTable のバージョンを 2.7.6 以後に更新できます。
この機能はパブリックプレビュー段階にあります。この機能を使用する場合は、Lindorm テクニカルサポート(DingTalk ID: s0s3eg3)にお問い合わせください。
UPDATE sensor SET c3='b' WHERE c1=1;
結果を確認する
SELECT * FROM sensor;
文を実行して、データが更新されたかどうかを確認できます。サンプル結果:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | b | b |
+----+----+----+----+
特定の列の値を増分する
LindormTable のバージョンは 2.7.6 以後である必要があります。現在のバージョンを表示し、コンソールで LindormTable のバージョンを 2.7.6 以後に更新できます。
この機能はパブリックプレビュー段階にあります。この機能を使用する場合は、Lindorm テクニカルサポート(DingTalk ID: s0s3eg3)にお問い合わせください。
UPDATE sensor SET c1 = c1 + 1 WHERE p1 = 1;
結果を確認する
SELECT * FROM sensor;
文を実行して、データが更新されたかどうかを確認できます。サンプル結果:
+------+------+------+------+
| p1 | c1 | c2 | c3 |
+------+------+------+------+
| 1 | 2 | b | b |
+------+------+------+------+
よくある質問
データの更新後、影響を受けた行数が予想と一致しないのはなぜですか?
検索インデックステーブルとプライマリテーブルのデータはリアルタイムで同期されます。プライマリテーブルの検索インデックスを作成し、更新条件がインデックス列にヒットした場合、データの同期遅延が原因で更新が失敗する可能性があります。その結果、影響を受けた行数は予想と一致しません。同期が完了した後、更新操作を再実行できます。検索インデックスの遅延については、「概要」トピックのよくある質問セクションをご参照ください。
複数の行のデータを同時に更新するときにタイムアウトエラーが発生するのはなぜですか?
1 万行を超えるデータを同時に更新しないことをお勧めします。どうしても必要な場合は、UPDATE 文で _l_operation_timeout_ パラメーターを指定してタイムアウト期間を制御することをお勧めします。たとえば、
UPDATE /*+ _l_operation_timeout_(30000) */ table1 SET a=1 WHERE b=2;
などです。 _l_operation_timeout_ パラメーターの詳細については、「HINT」トピックのhintOptions のパラメーターセクションをご参照ください。パラメーターを指定した後もタイムアウトの問題が解決しない場合は、Lindorm コンピュートエンジンを使用して複数の行のデータを同時に更新できます。