SQL の INSERT、UPDATE、DELETE ステートメントを使用して、Tablestore の非トランザクションテーブルに対してデータの書き込み、更新、削除を実行できます。
適用範囲
項目 | 説明 |
テーブルタイプ | 非トランザクションテーブル (トランザクション機能を有効化せずに作成されたテーブル) のみ。 |
サポートされる DML ステートメント |
|
クエリステートメント |
|
一部の DML 構文 |
|
前提条件
非トランザクションテーブルを作成済みであること。
CREATE TABLEステートメントを使用して、テーブルの SQL マッピングを作成済みであること。
RAM ユーザーとして DML 操作を実行するには、SQL_DML 権限を付与する必要があります。詳細については、「カスタム RAM ポリシー」をご参照ください。
使用方法
Tablestore コンソールまたは SDK を使用して、非トランザクションテーブルに対する DML 操作を実行できます。ここでは、それぞれの方法を説明します。
コンソール
Tablestore コンソールにログインします。
概要 ページで、インスタンス名 をクリックします。
インスタンスの管理 ページで、SQL 文を実行してクエリ タブをクリックします。
SQL エディタで DML ステートメントを入力し、SQL 文の実行 をクリックします。
例:行を挿入します。
INSERT INTO my_table VALUES (1, 'value1', 100);SDK
Java
Java SDK の SyncClient.sqlQuery() メソッドを使用して DML 文を実行し、SQLQueryResponse から影響を受けた行数 (getAffectedRows()) と消費された読み取り/書き込み CU (getConsumedCapacity()) を取得します。
SDK バージョン 5.17.11 以降を使用する必要があります。
SQLQueryRequest request = new SQLQueryRequest("INSERT INTO my_table VALUES (1, 'value1', 100)");
SQLQueryResponse response = client.sqlQuery(request);
long affectedRows = response.getAffectedRows();
Map<String, ConsumedCapacity> consumedCapacity = response.getConsumedCapacity();Go
Go SDK の TableStoreClient.SQLQuery() メソッドを使用して DML 文を実行し、SQLQueryResponse から影響を受ける行数 (AffectedRows) と消費された読み取り/書き込み CU (SQLQueryConsumed) を取得します。
SDK バージョン v1.9.2 以降を使用する必要があります。
request := &tablestore.SQLQueryRequest{Query: "INSERT INTO my_table VALUES (1, 1, 100, 'hello')"}
response, err := client.SQLQuery(request)
if err != nil {
log.Fatal(err)
}
affectedRows := response.AffectedRows
consumed := response.SQLQueryConsumedINSERT ステートメント
非トランザクションテーブルでは、INSERT ステートメントは単一行の挿入と、同一パーティションキー内でのアトミックな複数行バッチ挿入をサポートします。プライマリキーの競合が発生した場合、エラーが返され、既存データは上書きされません。
単一行の挿入
INSERT INTO user_table VALUES (1, 'value1', 100);単一パーティション内でのバッチ挿入
同じパーティションキーを共有する複数の行は、最大 200 行の単一バッチでアトミックに挿入できます。たとえば、テーブル構造が user_table(pk1 BIGINT, pk2 VARCHAR(1024), value BIGINT) で、pk1 がパーティションキーであるとします。パーティションキー pk1 の値が 1 である 2 つの行は、同じパーティションに属しているため、バッチでアトミックに挿入できます。
INSERT INTO user_table VALUES (1, 'attr1', 100), (1, 'attr2', 200);注意事項
プライマリキーの競合: 既存のプライマリキーを持つ行を挿入すると、エラーコード
OTSParameterInvalidとDuplicate entry for key 'PRIMARY'を含むエラーメッセージが返されます。既存のデータは上書きされません。パーティション間のバッチ挿入:バッチ
INSERTステートメント内のすべての行は、同じパーティションキーを持つ必要があります。バッチサイズの制限:200 行を超えるバッチ
INSERTステートメントは拒否されます。影響を受けた行数:単一行の
INSERTが成功すると 1 を返します。N 行のバッチ挿入が成功すると N を返します。プライマリキーの競合が発生した場合は、影響を受けた行数ではなくエラーが返されます。
UPDATE ステートメント
非トランザクションテーブルでは、UPDATE ステートメントは完全なプライマリキーに対する等価条件で指定された単一行の更新のみをサポートします。複合プライマリキーの場合、WHERE 句内の列の順序は、キーで定義された列の順序と一致する必要はありません。
定数値での更新
単一または複数の列を同時に更新できます。
-- 単一列の更新
UPDATE user_table SET attr_col = 999 WHERE pk_col = 1;
-- 複数列の更新
UPDATE user_table SET c1 = 10, c2 = 20, c3 = 'updated' WHERE id = 1;
-- 複合プライマリキーを持つ行の更新。WHERE 句内の列の順序はキーの定義と異なっても構いません。
UPDATE user_table SET value = 999 WHERE pk2 = 2 AND pk1 = 1;アトミックなインクリメントとデクリメント
BIGINT 属性列の値をアトミックにインクリメントまたはデクリメントできます。これはカウンターなどのシナリオで便利です。この操作は整数の属性列でのみサポートされ、DOUBLE、BOOL、VARCHAR などの他の型ではサポートされません。
-- 1 ずつインクリメント
UPDATE user_table SET counter = counter + 1 WHERE id = 1;
-- 指定した値だけインクリメント
UPDATE user_table SET counter = counter + 10 WHERE id = 1;
-- デクリメント
UPDATE user_table SET counter = counter - 5 WHERE id = 1;属性列を NULL に設定
属性列を NULL に設定すると、実質的に削除されます。システムは NULL 値を保存するのではなく、行から列を削除します。
UPDATE user_table SET attr_col = NULL WHERE pk_col = 1;注意事項
WHERE 句には、プライマリキー全体に対する等価条件を指定する必要があります:次のケースはサポートされておらず、
OTSParameterInvalidまたはOTSUnsupportOperationエラーが返されます。WHERE句に完全なプライマリキーが含まれていない。WHERE句がプライマリキー以外の列に対する条件を使用している。WHERE 句は範囲クエリ (
>、<、またはBETWEENなど) を使用します。WHERE 句は、
IN、LIKE、OR、!=などの非等価条件を使用します。WHERE句に完全なプライマリキーに加えて属性列の条件が含まれている。
プライマリキー列は変更できません:
SET句でプライマリキー列は変更できません。対象行が存在しない:存在しない行に対する
UPDATE操作は、影響を受けた行数 0 で完了し、エラーは返されません。
DELETE ステートメント
非トランザクションテーブルでは、DELETE ステートメントは完全なプライマリキーに対する等価条件で指定された単一行の削除のみをサポートします。複合プライマリキーの場合、WHERE 句内の列の順序は、キーで定義された列の順序と一致する必要はありません。
-- 単一プライマリキーでの削除
DELETE FROM user_table WHERE pk_col = 1;
-- 文字列プライマリキーでの削除
DELETE FROM user_table WHERE id = 'abc';
-- 複合プライマリキーでの削除
DELETE FROM user_table WHERE pk1 = 1 AND pk2 = 1;
-- WHERE 句内の列の順序がキーの定義と異なる複合プライマリキーでの削除
DELETE FROM user_table WHERE pk2 = 2 AND pk1 = 1;注意事項
WHERE 句は、完全なプライマリキーの等価条件でなければなりません: この制約は UPDATE ステートメントについても同様です。
WHERE句の省略、部分的なキー列やプライマリキー以外の列に対する条件、範囲条件、IN、LIKE、OR演算子、または追加の属性列に対する条件はサポートされていません。対象行が存在しない:存在しない行に対する
DELETE操作は、影響を受けた行数 0 で完了し、エラーは返されません。
制限事項
SQL 構文の制限
非トランザクションテーブルに対する DML 操作では、以下の SQL 構文はサポートされていません。
制限 | 操作 | 説明 |
|
| 完全なプライマリキーが必要です。 |
プライマリキー以外の列を含む |
| プライマリキー列に対する等価条件のみがサポートされます。 |
部分的なプライマリキーを含む |
| 完全な複合プライマリキーが必要です。 |
範囲条件( |
| 等価条件のみがサポートされます。 |
|
| 単一値の等価一致のみがサポートされます。 |
|
| あいまい一致はサポートされていません。 |
|
| 論理 |
|
| 不等条件はサポートされていません。 |
|
| 属性列の NULL 値チェックはサポートされていません。 |
プライマリキーと属性列の条件の組み合わせ |
| プライマリキーに対する等価条件のみがサポートされます。 |
|
| ソートはサポートされていません。 |
|
| 行数の制限はサポートされていません。 |
|
| エラーの無視はサポートされていません。 |
優先度設定 (例: |
| サポートされていません。 |
複数テーブル操作 |
| テーブル間の操作はサポートされていません。 |
パーティション名の指定 |
| サポートされていません。 |
インデックスヒント |
| インデックスヒントはサポートされていません。 |
|
|
|
|
| クエリ結果からの挿入はサポートされていません。 |
|
| 非トランザクションテーブルではサポートされていません。 |
|
| 非トランザクションテーブルではサポートされていません。 |
|
| サポートされていません。 |
プライマリキー列の更新 |
|
|
バッチ |
| 同一パーティションキー内で最大 200 行まで。 |
データ型の制限
型 | プライマリキー | 制限事項 |
| はい |
|
| はい | プライマリキー列として使用できます。 |
| はい | プライマリキー列として使用できます。 |
| いいえ | プライマリキーとして使用できません。 |
| いいえ | プライマリキーとして使用できません。属性列としてのみ使用できます。 |
| いいえ | プライマリキーとして使用できません。 |
| いいえ | 長さは 1 である必要があります。プライマリキーとして使用できません。 |
列オプションと制約
CREATE TABLE を使用する場合、サポートされる列オプションは PRIMARY KEY、NOT NULL、NULL、DEFAULT VALUE、ON UPDATE のみです。
PRIMARY KEY 制約のみがサポートされます。
特殊なテーブルタイプの制限
検索インデックステーブルおよびエイリアステーブルは、いかなる DML 操作 (INSERT、UPDATE、DELETE) もサポートしません。
課金
非トランザクションテーブルでは、INSERT、UPDATE、DELETE はすべて単一行のアトミック操作です。データを書き込む前に、システムは対象行を検証します (たとえば、行が存在するか、列の値が変更されたかを確認します) 。この検証プロセスで読み込み CU が消費されます。
書き込みが発生する操作:読み込み CU と書き込み CU の両方を消費します。
書き込みが発生しない操作 (たとえば、プライマリキーの競合がある
INSERT、存在しない行に対するUPDATEまたはDELETE、列の値が変更されないUPDATE) :読み込み CU のみを消費します。