DELETE
该语句用于从表中删除数据行。表可以是分区表或者非分区表。
对于明细表、聚合表,以及更新表,支持删除表中指定分区的数据。从 2.3 版本开始,主键表支持完整的 DELETE...WHERE 语义,即支持按主键、任意列、以及子查询结果删除数据。从 3.0 版本开始,主键类型表丰富了 DELETE...WHERE 语义,支持使用多表关联和公用表表达式(CTE)。
注意事项
- 执行 DELETE 操作需要有对应表的 DELETE 权限。
- 不建议您执行高频的 DELETE 操作。如需要,请在业务低峰期进行。
- DELETE 删除的是表中数据,表依然存在。如果要删除表,参见 DROP TABLE。
- 为防止误删整表,必须在 DELETE 语句中指定 WHERE 子句。
- 删除的数据会标记为“Deleted”,暂时保留在 Segment 中,不会立即进行物理删除。Compaction(数据版本合并)完成之后会被回收。
- 该操作会同时删除和表相关的物化视图的数据。
DELETE 与明细类型、聚合类型和更新类型表
语法
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 | 作为删除条件的列,可以指定一个或多个列。 |
op | Yes | 指定的算子。支持 = 、> 、< 、>= 、<= 、!= 、IN 和 NOT IN 。 |
使用限制
- 聚合类型和更新类型表仅支持 Key 列作为删除条件。明细类型表支持任意列作为删除条件。
- 条件之间只能是“AND”关系。若希望达成“OR”的关系,需要将条件分别写在两个 DELETE 语句中。
- 明细类型、聚合类型和更新表类型下,DELETE 语句目前不支持以子查询结果作为删除条件。
影响
执行 DELETE 语句后,可能会导致接下来一段时间内(Compaction 完成之前)的查询效率降低。影响程度取决于语句中指定的删除条件的数量。指定的条件越多,影响越大。
示例
创建表并插入数据
以下示例创建一张明细类型的分区表。
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');