DELETE
指定された条件に基づいてテーブルからデータ行を削除します。テーブルはパーティション化されたものでも、非パーティション化されたものでもかまいません。
重複キーテーブル、集計テーブル、ユニークキーテーブルでは、指定されたパーティションからデータを削除できます。v2.3から、主キーテーブルは完全な DELETE...WHERE 構文をサポートしており、主キー、任意のカラム、またはサブクエリの結果に基づいてデータ行を削除できます。v3.0から、StarRocks は DELETE...WHERE 構文をマルチテーブルジョインや共通テーブル式 (CTE) で強化しています。データベース内の他のテーブルと主キーテーブルをジョインする必要がある場合、USING 句または CTE でこれらの他のテーブルを参照できます。
使用上の注意
- DELETE を実行するテーブルとデータベースに対する権限が必要です。
- 頻繁な DELETE 操作は推奨されません。必要な場合は、ピーク時間外に実行してください。
- DELETE 操作はテーブル内のデータ のみを削除します。テーブル自体は残ります。テーブルを削除するには、DROP TABLE を実行してください。
- 誤操作によってテーブル全体のデータが削除されるのを防ぐため、DELETE 文には WHERE 句を指定する必要があります。
- 削除された行はすぐにはクリーンアップされません。それらは「削除済み」としてマークされ、セグメントに一時的に保存されます。物理的には、データバージョンのマージ(コンパクション)が完了した後にのみ行が削除されます。
- この操作は、このテーブルを参照するマテリアライズドビューのデータも削除します。
重複キーテーブル、集計テーブル、ユニークキーテーブル
構文
DELETE FROM [<db_name>.]<table_name> [PARTITION <partition_name>]
WHERE
column_name1 op { value | value_list } [ AND column_name2 op { value | value_list } ...]
パラメータ
| パラメータ | 必須 | 説明 |
|---|---|---|
db_name | No | 対象テーブルが属するデータベース。このパラメータが指定されていない場合、デフォルトで現在のデータベースが使用されます。 |
table_name | Yes | データを削除したいテーブル。 |
partition_name | No | データを削除したいパーティション。 |
column_name | Yes | DELETE 条件として使用したいカラム。1つ以上のカラムを指定できます。 |
op | Yes | DELETE 条件で使用する演算子。サポートされている演算子は =, >, <, >=, <=, !=, IN, NOT IN です。 |
制限と使用上の注意
-
重複キーテーブルでは、任意のカラム を DELETE 条件として使用できます。集計テーブルとユニークキーテーブルでは、キーのカラム のみを DELETE 条件として使用できます。
-
指定する条件は AND 関係でなければなりません。OR 関係で条件を指定したい場合は、別々の DELETE 文で条件を指定する必要があります。
-
重複キーテーブル、集計テーブル、ユニークキーテーブルでは、DELETE 文でサブクエリの結果を条件として使用することはサポートされていません。
影響
DELETE 文を実行した後、クラスターのクエリパフォーマンスが一時的に低下する可能性があります(コンパクションが完了するまで)。指定する条件の数に応じて、低下の度合いは異なります。条件の数が多いほど、低下の度合いが高くなります。
例
テーブルの作成とデータの挿入
次の例では、パーティション化された重複キーテーブルを作成します。
CREATE TABLE `my_table` (
`date` date NOT NULL,
`k1` int(11) NOT NULL COMMENT "",
`k2` varchar(65533) NULL DEFAULT "" COMMENT "")
DUPLICATE KEY(`date`)
PARTITION BY RANGE(`date`)
(
PARTITION p1 VALUES [('2022-03-11'), ('2022-03-12')),
PARTITION p2 VALUES [('2022-03-12'), ('2022-03-13'))
)
DISTRIBUTED BY HASH(`date`)
PROPERTIES
("replication_num" = "3");
INSERT INTO `my_table` VALUES
('2022-03-11', 3, 'abc'),
('2022-03-11', 2, 'acb'),
('2022-03-11', 4, 'abc'),
('2022-03-12', 2, 'bca'),
('2022-03-12', 4, 'cba'),
('2022-03-12', 5, 'cba');
データのクエリ
select * from my_table order by date;
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 3 | abc |
| 2022-03-11 | 2 | acb |
| 2022-03-11 | 4 | abc |
| 2022-03-12 | 2 | bca |
| 2022-03-12 | 4 | cba |
| 2022-03-12 | 5 | cba |
+------------+------+------+
データの削除
指定されたパーティションからデータを削除
k1 の値が 3 の行を p1 パーティションから削除します。
DELETE FROM my_table PARTITION p1
WHERE k1 = 3;
-- クエリ結果は、`k1` の値が `3` の行が削除されたことを示します。
select * from my_table partition (p1);
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 2 | acb |
| 2022-03-11 | 4 | abc |
+------------+------+------+
AND を使用して指定されたパーティションからデータを削除
k1 の値が 3 以上で、k2 の値が "abc" の行を p1 パーティションから削除します。
DELETE FROM my_table PARTITION p1
WHERE k1 >= 3 AND k2 = "abc";
select * from my_table partition (p1);
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 2 | acb |
+------------+------+------+
すべてのパーティションからデータを削除
k2 の値が "abc" または "cba" の行をすべてのパーティションから削除します。
DELETE FROM my_table
WHERE k2 in ("abc", "cba");
select * from my_table order by date;
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 2 | acb |
| 2022-03-12 | 2 | bca |
+------------+------+------+
主キーテーブル
v2.3から、主キーテーブルは完全な DELETE...WHERE 構文をサポートしており、主キー、任意のカラム、またはサブクエリに基づいてデータ行を削除できます。
構文
[ WITH <with_query> [, ...] ]
DELETE FROM <table_name>
[ USING <from_item> [, ...] ]
[ WHERE <where_condition> ]
パラメータ
| パラメータ | 必須 | 説明 |
|---|---|---|
with_query | No | DELETE 文で名前で参照できる1つ以上の CTE。CTE は一時的な結果セットで、複雑な文の可読性を向上させることができます。 |
table_name | Yes | データを削除したいテーブル。 |
from_item | No | データベース内の1つ以上の他のテーブル。これらのテーブルは、WHERE 句で指定された条件に基づいて操作対象のテーブルとジョインできます。ジョインクエリの結果セットに基づいて、StarRocks は操作対象のテーブルから一致する行を削除します。たとえば 、USING 句が USING t1 WHERE t0.pk = t1.pk; の場合、StarRocks は DELETE 文を実行する際に USING 句のテーブル式を t0 JOIN t1 ON t0.pk=t1.pk; に変換します。 |
where_condition | Yes | 削除したい行の条件。WHERE 条件を満たす行のみが削除されます。このパラメータは、誤ってテーブル全体を削除するのを防ぐために必要です。テーブル全体を削除したい場合は、'WHERE true' を使用できます。 |
制限と使用上の注意
- 主キーテーブルは、指定されたパーティションからのデータ削除をサポートしていません。たとえば、
DELETE FROM <table_name> PARTITION <partition_id> WHERE <where_condition>のような操作はできません。 - 次の比較演算子がサポートされています:
=,>,<,>=,<=,!=,IN,NOT IN。 - 次の論理演算子がサポートされています:
ANDとOR。 - DELETE 文を使用して同時に DELETE 操作を実行したり、データロード時にデータを削除することはできません。そのような操作を行うと、トランザクションの原子性、一貫性、分離性、耐久性(ACID)が保証されない可能性があります。
例
テーブルの作成とデータの挿入
score_board という名前の主キーテーブルを作成します。
CREATE TABLE `score_board` (
`id` int(11) NOT NULL COMMENT "",
`name` varchar(65533) NULL DEFAULT "" COMMENT "",
`score` int(11) NOT NULL DEFAULT "0" COMMENT ""
) ENGINE=OLAP
PRIMARY KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"replication_num" = "3",
"storage_format" = "DEFAULT",
"enable_persistent_index" = "false"
);
INSERT INTO score_board VALUES
(0, 'Jack', 21),
(1, 'Bob', 21),
(2, 'Stan', 21),
(3, 'Sam', 22);
データのクエリ
score_board テーブルにデータを挿入するために次の文を実行します。
select * from score_board;
+------+------+------+
| id | name | score|
+------+------+------+
| 0 | Jack | 21 |
| 1 | Bob | 21 |
| 2 | Stan | 21 |
| 3 | Sam | 22 |
+------+------+------+
4 rows in set (0.00 sec)