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

MaxCompute:DELETE

最終更新日:Dec 26, 2025

DELETE 文は、トランザクションテーブルまたは Delta テーブルから、指定された条件を満たす 1 つ以上の行を削除します。

前提条件

DELETE 文または UPDATE 文を実行する前に、対象のトランザクションテーブルまたは Delta テーブルに対する Select 権限および Update 権限が必要です。権限付与の詳細については、「MaxCompute の権限」をご参照ください。

制限事項

  • DELETE および UPDATE 機能は、トランザクションテーブルおよび Delta テーブルでのみ使用でき、以下の制限があります。

    説明

    トランザクションテーブルと Delta テーブルの詳細については、「トランザクションテーブルと Delta テーブルのパラメーター」をご参照ください。

    • Delta テーブルの UPDATE 構文は、プライマリキー (PK) 列の変更をサポートしていません。

注意事項

DELETE または UPDATE 操作を使用してテーブルまたはパーティションのデータを削除または更新する場合は、次の項目を考慮してください。

  • テーブル内の少量のデータを削除または更新し、その操作と後続の読み取りの両方が頻繁に行われない場合は、DELETE 操作および UPDATE 操作を使用します。複数回の削除または更新操作を実行した後、テーブルのベースファイルと Delta ファイルをマージして、ストレージフットプリントを削減します。詳細については、「トランザクションテーブルファイルのマージ」をご参照ください。

  • 多数の行 (5% 超) の削除または更新は低頻度で行うが、その後のテーブルに対する読み取り操作が頻繁である場合は、INSERT OVERWRITE または INSERT INTO を使用します。 詳細については、「データを挿入または上書きする (INSERT INTO | INSERT OVERWRITE)」をご参照ください。

    例えば、あるビジネスシナリオでは、1 日に 10 回、データの 10% を削除または更新します。DELETE および UPDATE 操作によるコストとその後の読み取りパフォーマンスの劣化が、操作ごとに INSERT OVERWRITE または INSERT INTO を使用する場合よりも低いかどうかを評価します。お客様の特定のシナリオで 2 つのメソッドの効率を比較し、より適切なオプションを選択します。

  • データを削除すると Delta ファイルが生成されるため、この操作ではストレージはすぐには削減されません。 DELETE 操作を使用してストレージを削減したい場合は、テーブルのベースファイルと Delta ファイルをマージする必要があります。 詳細については、「トランザクションテーブルファイルのマージ」をご参照ください。

  • MaxCompute は DELETE ジョブと UPDATE ジョブをバッチプロセスとして実行します。各文はリソースを消費し、料金が発生します。データをバッチで削除または更新する必要があります。たとえば、Python スクリプトを使用して、各文が 1 行または数行のデータのみを操作する多数の行レベルの更新ジョブを生成してサブミットする場合、SQL によってスキャンされる入力データの量に基づいて各文でコストが発生します。このような多数の文の累積コストは、費用を大幅に増加させ、システム効率を低下させます。以下にコマンドの例を示します。

    • 推奨されるメソッド:

      UPDATE table1 SET col1= (SELECT value1 FROM table2 WHERE table1.id = table2.id AND table1.region = table2.region);
    • 推奨されないメソッド:

      UPDATE table1 SET col1=1 WHERE id='2021063001' AND region='beijing';                 
      UPDATE table1 SET col1=2 WHERE id='2021063002' AND region='beijing';

構文

DELETE FROM <table_name> [[AS] alias] [WHERE <condition>];

パラメーター

パラメーター

必須

説明

table_name

はい

DELETE 操作を実行する Transactional テーブルまたは Delta テーブルの名前。

alias

いいえ

テーブルのエイリアス。

where_condition

いいえ

条件を満たすデータをフィルターする `WHERE` 句。`WHERE` 句の詳細については、「WHERE 句 (WHERE_condition)」をご参照ください。`WHERE` 句を含めない場合、テーブル内のすべてのデータが削除されます。

  • 例 1: acid_delete という名前の非パーティションテーブルを作成してデータをインポートした後、DELETE 操作を実行して指定された条件を満たす行を削除します。 サンプルコマンドは次のとおりです。

    -- acid_delete という名前のトランザクションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS acid_delete (id BIGINT) TBLPROPERTIES ("transactional"="true");
    
    -- データを挿入します。
    INSERT OVERWRITE TABLE acid_delete VALUES (1), (2), (3), (2);
    
    -- 挿入されたデータを表示します。
    SELECT * FROM acid_delete;
    
    +------------+
    | id         |
    +------------+
    | 1          |
    | 2          |
    | 3          |
    | 2          |
    +------------+
    
    -- id が 2 の行を削除します。このコマンドを MaxCompute クライアント (odpscmd) で実行する場合、確認のために yes または no を入力する必要があります。
    DELETE FROM acid_delete WHERE id = 2;
    -- 次のコマンドは上記のコマンドと同じです。
    DELETE FROM acid_delete ad WHERE ad.id = 2;
    
    -- 結果を表示します。テーブルには 1 と 3 のデータのみが含まれるようになります。
    SELECT * FROM acid_delete;
    
    +------------+
    | id         |
    +------------+
    | 1          |
    | 3          |
    +------------+
  • 例 2: acid_delete_pt という名前のパーティションテーブルを作成し、データをインポートしてから、DELETE 操作を実行して指定された条件を満たす行を削除します。 以下にサンプルコマンドを示します。

    -- acid_delete_pt という名前のトランザクションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS acid_delete_pt (id BIGINT) PARTITIONED BY (ds STRING) TBLPROPERTIES ("transactional"="true");
    
    -- パーティションを追加します。
    ALTER TABLE acid_delete_pt ADD IF NOT EXISTS PARTITION (ds = '2019');
    ALTER TABLE acid_delete_pt ADD IF NOT EXISTS PARTITION (ds = '2018');
    
    -- データを挿入します。
    INSERT OVERWRITE TABLE acid_delete_pt PARTITION (ds = '2019') VALUES (1), (2), (3);
    INSERT OVERWRITE TABLE acid_delete_pt PARTITION (ds = '2018') VALUES (1), (2), (3);
    
    -- 挿入されたデータを表示します。
    SELECT * FROM acid_delete_pt;
    
    +------------+------------+
    | id         | ds         |
    +------------+------------+
    | 1          | 2018       |
    | 2          | 2018       |
    | 3          | 2018       |
    | 1          | 2019       |
    | 2          | 2019       |
    | 3          | 2019       |
    +------------+------------+
    
    -- パーティションが 2019 で id が 2 のデータを削除します。このコマンドを MaxCompute クライアント (odpscmd) で実行する場合、確認のために yes または no を入力する必要があります。
    DELETE FROM acid_delete_pt WHERE ds = '2019' AND id = 2;
    
    -- 結果を表示します。パーティションが 2019 で id が 2 のデータが削除されました。
    SELECT * FROM acid_delete_pt;
    
    +------------+------------+
    | id         | ds         |
    +------------+------------+
    | 1          | 2018       |
    | 2          | 2018       |
    | 3          | 2018       |
    | 1          | 2019       |
    | 3          | 2019       |
    +------------+------------+
  • 例 3: `acid_delete_t` という名前のターゲットテーブルと、`acid_delete_s` という名前の関連テーブルを作成します。次に、結合操作を通じて指定された条件を満たす行を削除します。コマンドの例は次のとおりです:

    -- acid_delete_t という名前のターゲットトランザクションテーブルと、acid_delete_s という名前の関連テーブルを作成します。
    CREATE TABLE IF NOT EXISTS acid_delete_t (id INT, value1 INT, value2 INT) TBLPROPERTIES ("transactional"="true");
    CREATE TABLE IF NOT EXISTS acid_delete_s (id INT, value1 INT, value2 INT);
    
    -- データを挿入します。
    INSERT OVERWRITE TABLE acid_delete_t VALUES (2, 20, 21), (3, 30, 31), (4, 40, 41);
    INSERT OVERWRITE TABLE acid_delete_s VALUES (1, 100, 101), (2, 200, 201), (3, 300, 301);
    
    -- acid_delete_t テーブルから、id が acid_delete_s テーブルの id と一致しない行を削除します。このコマンドを MaxCompute クライアント (odpscmd) で実行する場合、確認のために yes または no を入力する必要があります。
    DELETE FROM acid_delete_t WHERE NOT EXISTS (SELECT * FROM acid_delete_s WHERE acid_delete_t.id = acid_delete_s.id);
    -- 次のコマンドは上記のコマンドと同じです。
    DELETE FROM acid_delete_t a WHERE NOT EXISTS (SELECT * FROM acid_delete_s b WHERE a.id = b.id);
    
    -- 結果を表示します。テーブルには id が 2 と 3 のデータのみが含まれるようになります。
    SELECT * FROM acid_delete_t;
    
    +------------+------------+------------+
    | id         | value1     | value2     |
    +------------+------------+------------+
    | 2          | 20         | 21         |
    | 3          | 30         | 31         |
    +------------+------------+------------+
  • 例 4: `mf_dt` という名前の Delta テーブルを作成し、データをインポートしてから、DELETE 操作を実行して指定された条件を満たす行を削除します。コマンドの例は次のとおりです:

    -- mf_dt という名前のターゲット Delta テーブルを作成します。
    CREATE TABLE IF  NOT EXISTS mf_dt (pk BIGINT  NOT NULL PRIMARY KEY, 
                      val  BIGINT NOT NULL) 
                      PARTITIONED BY(dd STRING, hh STRING) 
                      tblproperties ("transactional"="true");
    
    -- データを挿入します。
    INSERT OVERWRITE TABLE mf_dt PARTITION (dd='01', hh='02') VALUES (1, 1), (2, 2), (3, 3);
    
    -- 挿入されたデータを表示します。
    SELECT * FROM mf_dt WHERE dd='01' AND hh='02';
    
    -- 次の結果が返されます:
    +------------+------------+----+----+
    | pk         | val        | dd | hh |
    +------------+------------+----+----+
    | 1          | 1          | 01 | 02 |
    | 3          | 3          | 01 | 02 |
    | 2          | 2          | 01 | 02 |
    +------------+------------+----+----+
    
    -- パーティションが 01 と 02 で、val が 2 のデータを削除します。
    DELETE FROM mf_dt WHERE val = 2  AND dd='01' AND hh='02';
    
    -- 結果を表示します。テーブルには val が 1 と 3 のデータのみが含まれるようになります。
    SELECT * FROM mf_dt WHERE dd='01' AND hh='02';
    
    -- 次の結果が返されます:
    +------------+------------+----+----+
    | pk         | val        | dd | hh |
    +------------+------------+----+----+
    | 1          | 1          | 01 | 02 |
    | 3          | 3          | 01 | 02 |
    +------------+------------+----+----+

関連する文

  • UPDATE:パーティション化されたトランザクションテーブルまたは非パーティション化されたトランザクションテーブルで、指定された条件を満たす行の 1 つ以上の列の値を更新します。

  • ALTER TABLE:トランザクションテーブルファイルをマージします。