すべてのプロダクト
Search
ドキュメントセンター

Tablestore:DML 操作

最終更新日:Jun 08, 2026

SQL の INSERTUPDATEDELETE ステートメントを使用して、Tablestore の非トランザクションテーブルに対してデータの書き込み、更新、削除を実行できます。

適用範囲

項目

説明

テーブルタイプ

非トランザクションテーブル (トランザクション機能を有効化せずに作成されたテーブル) のみ。

サポートされる DML ステートメント

INSERTUPDATEDELETE

クエリステートメント

SELECT および SHOW ステートメントは DML の制限を受けません。詳細については、「SQL クエリに関するドキュメント」をご参照ください。

一部の DML 構文

INSERT IGNOREON DUPLICATE KEY UPDATE などの句、および REPLACE ステートメントは、トランザクションテーブルでのみサポートされます。

前提条件

  • 非トランザクションテーブルを作成済みであること。

  • CREATE TABLE ステートメントを使用して、テーブルの SQL マッピングを作成済みであること。

説明

RAM ユーザーとして DML 操作を実行するには、SQL_DML 権限を付与する必要があります。詳細については、「カスタム RAM ポリシー」をご参照ください。

使用方法

Tablestore コンソールまたは SDK を使用して、非トランザクションテーブルに対する DML 操作を実行できます。ここでは、それぞれの方法を説明します。

コンソール

  1. Tablestore コンソールにログインします。

  2. 概要 ページで、インスタンス名 をクリックします。

  3. インスタンスの管理 ページで、SQL 文を実行してクエリ タブをクリックします。

  4. 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.SQLQueryConsumed

INSERT ステートメント

非トランザクションテーブルでは、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);

注意事項

  • プライマリキーの競合: 既存のプライマリキーを持つ行を挿入すると、エラーコード OTSParameterInvalidDuplicate 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 属性列の値をアトミックにインクリメントまたはデクリメントできます。これはカウンターなどのシナリオで便利です。この操作は整数の属性列でのみサポートされ、DOUBLEBOOLVARCHAR などの他の型ではサポートされません。

-- 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 句は、INLIKEOR!= などの非等価条件を使用します。

    • 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 句の省略、部分的なキー列やプライマリキー以外の列に対する条件、範囲条件、INLIKEOR 演算子、または追加の属性列に対する条件はサポートされていません。

  • 対象行が存在しない:存在しない行に対する DELETE 操作は、影響を受けた行数 0 で完了し、エラーは返されません。

制限事項

SQL 構文の制限

非トランザクションテーブルに対する DML 操作では、以下の SQL 構文はサポートされていません。

制限

操作

説明

WHERE 句なし

UPDATEDELETE

完全なプライマリキーが必要です。

プライマリキー以外の列を含む WHERE

UPDATEDELETE

プライマリキー列に対する等価条件のみがサポートされます。

部分的なプライマリキーを含む WHERE

UPDATEDELETE

完全な複合プライマリキーが必要です。

範囲条件(><=BETWEEN

UPDATEDELETE

等価条件のみがサポートされます。

IN 句 (複数の値)

UPDATEDELETE

単一値の等価一致のみがサポートされます。

LIKE 条件

UPDATEDELETE

あいまい一致はサポートされていません。

OR 条件

UPDATEDELETE

論理 OR はサポートされていません。

!= 条件

UPDATEDELETE

不等条件はサポートされていません。

IS NULL 条件 (属性列)

UPDATEDELETE

属性列の NULL 値チェックはサポートされていません。

プライマリキーと属性列の条件の組み合わせ

UPDATEDELETE

プライマリキーに対する等価条件のみがサポートされます。

ORDER BY

UPDATEDELETE

ソートはサポートされていません。

LIMIT

UPDATEDELETE

行数の制限はサポートされていません。

IGNORE オプション

UPDATEDELETE

エラーの無視はサポートされていません。

優先度設定 (例:HIGH_PRIORITY)

INSERTUPDATEDELETE

サポートされていません。

複数テーブル操作

UPDATEDELETE

テーブル間の操作はサポートされていません。

パーティション名の指定

INSERTUPDATEDELETE

サポートされていません。

インデックスヒント

UPDATEDELETE

インデックスヒントはサポートされていません。

INSERT SET 構文

INSERT

INSERT INTO t SET col=val はサポートされていません。

INSERT ... SELECT

INSERT

クエリ結果からの挿入はサポートされていません。

INSERT IGNORE

INSERT

非トランザクションテーブルではサポートされていません。

ON DUPLICATE KEY UPDATE

INSERT

非トランザクションテーブルではサポートされていません。

REPLACE

INSERT

サポートされていません。

プライマリキー列の更新

UPDATE

SET 句はプライマリキー列を変更できません。

バッチ INSERT の行数

INSERT

同一パーティションキー内で最大 200 行まで。

データ型の制限

プライマリキー

制限事項

BIGINT

はい

UNSIGNED 属性はサポートされていません。プライマリキー値の有効範囲は -9223372036854775808 から 9223372036854775806 です (Long.MAX_VALUE が予約済みのシステム値であり使用できないため、範囲は [-2^63, 2^63 - 2] となります)。

VARCHAR

はい

プライマリキー列として使用できます。

VARBINARY

はい

プライマリキー列として使用できます。

DOUBLE

いいえ

プライマリキーとして使用できません。

MEDIUMBLOB

いいえ

プライマリキーとして使用できません。属性列としてのみ使用できます。

MEDIUMTEXT

いいえ

プライマリキーとして使用できません。

BOOL / TINYINT(1)

いいえ

長さは 1 である必要があります。プライマリキーとして使用できません。

列オプションと制約

CREATE TABLE を使用する場合、サポートされる列オプションは PRIMARY KEYNOT NULLNULLDEFAULT VALUEON UPDATE のみです。

PRIMARY KEY 制約のみがサポートされます。

特殊なテーブルタイプの制限

検索インデックステーブルおよびエイリアステーブルは、いかなる DML 操作 (INSERTUPDATEDELETE) もサポートしません。

課金

非トランザクションテーブルでは、INSERTUPDATEDELETE はすべて単一行のアトミック操作です。データを書き込む前に、システムは対象行を検証します (たとえば、行が存在するか、列の値が変更されたかを確認します) 。この検証プロセスで読み込み CU が消費されます。

  • 書き込みが発生する操作:読み込み CU と書き込み CU の両方を消費します。

  • 書き込みが発生しない操作 (たとえば、プライマリキーの競合がある INSERT、存在しない行に対する UPDATE または DELETE、列の値が変更されない UPDATE) :読み込み CU のみを消費します。