DELETE
更新时间:2025-10-16
描述
该语句用于按条件删除指定 table(base index)partition 中的数据。
该操作会同时删除和此 base index 相关的 rollup index 的数据。
语法
语法一:该语法只能指定过滤谓词
SQL
1DELETE FROM table_name [table_alias] [PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
2WHERE
3column_name op { value | value_list } [ AND column_name op { value | value_list } ...];
语法二:该语法只能在 UNIQUE KEY 模型表上使用
SQL
1[cte]
2DELETE FROM table_name [table_alias]
3 [PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
4 [USING additional_tables]
5 WHERE condition
Required Parameters
- table_name: 指定需要删除数据的表
- column_name: 属于 table_name 的列
- op: 逻辑比较操作符,可选类型包括:=, >, <, >=, <=, !=, in, not in
- value | value_list: 做逻辑比较的值或值列表
- WHERE condition: 指定一个用于选择删除行的条件
Optional Parameters
- cte: 通用表达式。可以是 'WITH a AS SELECT * FROM tbl' 形式
- PARTITION partition_name | PARTITIONS (partition_name [, partition_name]): 指定执行删除数据的分区名,如果表不存在此分区,则报错
- table_alias: 表的别名
- USING additional_tables: 如果需要在 WHERE 语句中使用其他的表来帮助识别需要删除的行,则可以在 USING 中指定这些表或者查询。
Note
- 使用聚合类的表模型(AGGREGATE、UNIQUE)只能指定 key 列上的条件。
- 当选定的 key 列不存在于某个 rollup 中时,无法进行 delete。
- 语法一中,条件之间只能是“与”的关系。若希望达成“或”的关系,需要将条件分写在两个 DELETE 语句中。
- 语法一中,如果为分区表,需要指定分区,如果不指定,PALO 会从条件中推断出分区。两种情况下,PALO 无法从条件中推断出分区:1) 条件中不包含分区列;2) 分区列的 op 为 not in。如果分区表不是 Unique 表,当分区表未指定分区,或者无法从条件中推断分区的时候,需要设置会话变量 delete_without_partition 为 true,此时 delete 会应用到所有分区。该功能自 PALO 1.2 版本起支持
- 该语句可能会降低执行后一段时间内的查询效率。影响程度取决于语句中指定的删除条件的数量。指定的条件越多,影响越大。
示例
-
删除 my_table partition p1 中 k1 列值为 3 的数据行
SQL1DELETE FROM my_table PARTITION p1 2 WHERE k1 = 3; -
删除 my_table partition p1 中 k1 列值大于等于 3 且 k2 列值为 "abc" 的数据行
SQL1DELETE FROM my_table PARTITION p1 2WHERE k1 >= 3 AND k2 = "abc"; -
删除 my_table partition p1, p2 中 k1 列值大于等于 3 且 k2 列值为 "abc" 的数据行
SQL1DELETE FROM my_table PARTITIONS (p1, p2) 2WHERE k1 >= 3 AND k2 = "abc"; -
使用
t2和t3表连接的结果,删除t1中的数据,删除的表只支持 unique 模型SQL1-- 创建 t1, t2, t3 三张表 2CREATE TABLE t1 3 (id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE) 4UNIQUE KEY (id) 5DISTRIBUTED BY HASH (id) 6PROPERTIES('replication_num'='1', "function_column.sequence_col" = "c4"); 7 8CREATE TABLE t2 9 (id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE) 10DISTRIBUTED BY HASH (id) 11PROPERTIES('replication_num'='1'); 12 13CREATE TABLE t3 14 (id INT) 15DISTRIBUTED BY HASH (id) 16PROPERTIES('replication_num'='1'); 17 18-- 插入数据 19INSERT INTO t1 VALUES 20 (1, 1, '1', 1.0, '2000-01-01'), 21 (2, 2, '2', 2.0, '2000-01-02'), 22 (3, 3, '3', 3.0, '2000-01-03'); 23 24INSERT INTO t2 VALUES 25 (1, 10, '10', 10.0, '2000-01-10'), 26 (2, 20, '20', 20.0, '2000-01-20'), 27 (3, 30, '30', 30.0, '2000-01-30'), 28 (4, 4, '4', 4.0, '2000-01-04'), 29 (5, 5, '5', 5.0, '2000-01-05'); 30 31INSERT INTO t3 VALUES 32 (1), 33 (4), 34 (5); 35 36-- 删除 t1 中的数据 37DELETE FROM t1 38 USING t2 INNER JOIN t3 ON t2.id = t3.id 39 WHERE t1.id = t2.id;预期结果为,删除了
t1表id为1的列Plain Text1+----+----+----+--------+------------+ 2| id | c1 | c2 | c3 | c4 | 3+----+----+----+--------+------------+ 4| 2 | 2 | 2 | 2.0 | 2000-01-02 | 5| 3 | 3 | 3 | 3.0 | 2000-01-03 | 6+----+----+----+--------+------------+ -
使用 cte 关联删除
SQL1create table orders( 2 o_orderkey bigint, 3 o_totalprice decimal(15, 2) 4) unique key(o_orderkey) 5distributed by hash(o_orderkey) buckets 1 6properties ( 7"replication_num" = "1" 8); 9 10insert into orders values 11(1, 34.1), 12(2, 432.8); 13 14create table lineitem( 15l_linenumber int, 16o_orderkey bigint, 17l_discount decimal(15, 2) 18) unique key(l_linenumber) 19distributed by hash(l_linenumber) buckets 1 20properties ( 21"replication_num" = "1" 22); 23 24insert into lineitem values 25(1, 1, 1.23), 26(2, 1, 3.21), 27(3, 2, 18.08), 28(4, 2, 23.48); 29 30with discount_orders as ( 31select * from orders 32where o_totalprice > 100 33) 34delete from lineitem 35using discount_orders 36where lineitem.o_orderkey = discount_orders.o_orderkey;
关键词
Plain Text
1DELETE
