メインコンテンツまでスキップ
バージョン: 4.x

DELETE コマンドを使用したデータの削除

DELETE文は、MySQLプロトコルを通じて、条件に基づいて指定されたTableまたはパーティションからデータを削除します。単純な述語の組み合わせを使用して削除するデータを指定することをサポートし、またUSING句を使用してプライマリキーTableの削除において複数のTableを結合することもサポートします。

フィルタ述語を指定した削除

DELETE FROM table_name [table_alias]
[PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
WHERE column_name op { value | value_list } [ AND column_name op { value | value_list } ...];

必須パラメータ

  • table_name: データを削除する対象のTable。

  • column_name: table_nameに属するカラム。

  • op: 論理比較演算子。以下を含む: =, >, <, >=, <=, !=, in, not in。

  • value | value_list: 論理比較に使用する値または値のリスト。

オプションパラメータ

  • PARTITION partition_name | PARTITIONS (partition_name [, partition_name]): データ削除を実行するパーティション名を指定します。Tableにこのパーティションが存在しない場合、エラーが報告されます。

  • table_alias: Tableのエイリアス。

使用制限

  • AggregateTableモデルを使用する場合、条件はKeyカラムでのみ指定できます。選択されたKeyカラムがRollupに存在しない場合、削除は実行できません。

  • パーティションTableの場合、パーティションを指定する必要があります。指定されない場合、Dorisは条件からパーティションを推測します。

    • Dorisが条件からパーティションを推測できない場合が2つあります:

      1. 条件にパーティションカラムが含まれていない。
      2. パーティションカラムのopnot inである。
    • パーティションTableがUniqueTableではなく、パーティションが指定されていないか条件からパーティションを推測できない場合、セッション変数delete_without_partitiontrueに設定する必要があり、削除操作はすべてのパーティションに適用されます。

1. my_tableのパーティションp1で、カラムk1の値が3である行を削除

DELETE FROM my_table PARTITION p1
WHERE k1 = 3;

2. my_tableのパーティションp1において、列k1の値が3以上かつ列statusの値が"outdated"である行を削除する

DELETE FROM my_table PARTITION p1
WHERE k1 >= 3 AND status = "outdated";

3. my_tableのパーティションp1p2において、列k1の値が3以上かつ列dtの値が"2024-10-01"から"2024-10-31"の間にある行を削除する

DELETE FROM my_table PARTITIONS (p1, p2)
WHERE k1 >= 3 AND dt >= "2024-10-01" AND dt <= "2024-10-31";

USING句を使用した削除

一部のシナリオでは、削除するデータを正確に特定するために複数のTableを結合する必要があります。このような場合、USING句が非常に有用です。構文は以下の通りです:

DELETE FROM table_name [table_alias]
[PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
[USING additional_tables]
WHERE condition

必須パラメータ

  • table_name: データを削除する対象のTable。
  • WHERE condition: 削除する行を選択するための条件を指定します。

オプションパラメータ

  • PARTITION partition_name | PARTITIONS (partition_name [, partition_name]): データ削除を実行するパーティション名を指定します。Tableにこのパーティションが存在しない場合、エラーが報告されます。
  • table_alias: Tableのエイリアス。

注意事項

  • この形式はUNIQUE KEYモデルのTableでのみ使用できます。

Tablet2t3の結合結果を使用して、t1からデータを削除します。削除対象のTableはuniqueモデルのみサポートします。

-- Create tables t1, t2, t3
CREATE TABLE t1
(id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE)
UNIQUE KEY (id)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1', "function_column.sequence_col" = "c4");

CREATE TABLE t2
(id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1');

CREATE TABLE t3
(id INT)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1');

-- Insert data
INSERT INTO t1 VALUES
(1, 1, '1', 1.0, '2000-01-01'),
(2, 2, '2', 2.0, '2000-01-02'),
(3, 3, '3', 3.0, '2000-01-03');

INSERT INTO t2 VALUES
(1, 10, '10', 10.0, '2000-01-10'),
(2, 20, '20', 20.0, '2000-01-20'),
(3, 30, '30', 30.0, '2000-01-30'),
(4, 4, '4', 4.0, '2000-01-04'),
(5, 5, '5', 5.0, '2000-01-05');

INSERT INTO t3 VALUES
(1),
(4),
(5);

-- Delete data from t1
DELETE FROM t1
USING t2 INNER JOIN t3 ON t2.id = t3.id
WHERE t1.id = t2.id;

期待される結果は、Tablet1においてid1である行を削除することです。

+----+----+----+--------+------------+
| id | c1 | c2 | c3 | c4 |
+----+----+----+--------+------------+
| 2 | 2 | 2 | 2.0 | 2000-01-02 |
| 3 | 3 | 3 | 3.0 | 2000-01-03 |
+----+----+----+--------+------------+

関連設定

タイムアウト設定

  • insert_timeout: delete操作はSQLコマンドであり、特別な負荷と見なされるため、delete文はSessionのinsert_timeout値の影響を受けます。SET insert_timeout = xxxでタイムアウトを増やすことができます。単位は秒です。

IN述語設定

  • max_allowed_in_element_num_of_delete: ユーザーがin述語で大量の要素を使用する必要がある場合、この項目を調整して許可される要素の上限を増やすことができます。デフォルト値は1024です。

履歴の表示

ユーザーはSHOW DELETE文を使用して、完了したdeleteレコードの履歴を表示できます。

構文は以下の通りです:

SHOW DELETE [FROM db_name]

例:

mysql> show delete from test_db;
+-----------+---------------+---------------------+-----------------+----------+
| TableName | PartitionName | CreateTime | DeleteCondition | State |
+-----------+---------------+---------------------+-----------------+----------+
| empty_tbl | p3 | 2020-04-15 23:09:35 | k1 EQ "1" | FINISHED |
| test_tbl | p4 | 2020-04-15 23:09:53 | k1 GT "80" | FINISHED |
+-----------+---------------+---------------------+-----------------+----------+
2 rows in set (0.00 sec)

パフォーマンス推奨事項

  1. 詳細Table(Duplicate Key)および集約Table(Aggregate Key)では、削除操作は高速に実行されますが、短時間での大量の削除操作はクエリパフォーマンスに影響します。

  2. プライマリキーTable(Unique Key)では、削除操作はINSERT INTO文に変換されます。大きな範囲を削除する場合、実行速度は遅くなりますが、短時間での大量の削除操作はクエリパフォーマンスに大きな影響を与えません。

構文

詳細な削除構文については、DELETE構文マニュアルを参照してください。