DELETE
功能描述
从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行,结果只保留表结构。
注意事项
- 要删除表中的数据,用户必须对它有DELETE权限。同样也必须有USING子句引用的表以及condition上读取的表的SELECT权限。
- 对于复制表,仅支持两种场景下的DELETE操作:
- 有主键约束的场景。
- 执行计划能下推的场景。
- 对于列存表,暂时不支持RETURNING子句。

- 避免使用UPDATE/DELETE大批量刷新和删除数据,考虑使用TRUNCATE PARTITION/DROP PARTITION代替。
- 更多开发设计规范参见总体开发设计规范。
语法格式
1 2 3 4 5 6 |
[ WITH [ RECURSIVE ] with_query [, ...] ] DELETE [/*+ plan_hint */] FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ] [ PARTITION ( partition_name ) | PARTITION FOR ( partition_key_value [, ...] ) ] [ USING using_list ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING { * | { output_expr [ [ AS ] output_name ] } [, ...] } ]; |
参数说明
参数 |
描述 |
取值范围 |
---|---|---|
WITH [ RECURSIVE ] with_query [, ...] |
用于声明一个或多个可以在主查询中通过名字引用的子查询,相当于临时表。 如果声明了RECURSIVE,则允许SELECT子查询通过名字引用它自己。 其中with_query的详细格式为: with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} ) – with_query_name指定子查询生成的结果集名字,在查询中可使用该名称访问子查询的结果集。 – column_name指定子查询结果集中显示的列名。 – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 |
- |
plan_hint子句 |
以/*+ */的形式在关键字后,用于对指定语句块生成的计划进行hint调优,详细用法请参见使用Plan Hint进行调优。 |
- |
ONLY |
如果指定ONLY,则只有指定表被删除;如果没有指定ONLY,则指定表及其所有继承表都会被删除。 该参数仅为了兼容PG保留,DWS不支持继承表。 |
- |
table_name |
目标表的名字(可以有模式修饰)。 |
已存在的表名。 |
alias |
目标表的别名。 |
字符串,符合标识符命名规范。详情请参见标识符命名规范。 |
partition_name |
分区名。仅8.2.1及以上集群版本支持该选项。 |
已存在的分区名。 |
partition_key_value |
分区键值。 通过PARTITION FOR ( partition_key_value [, ...] )子句指定的这一组值,可以唯一确定一个分区。 |
需要进行重命名分区的分区键取值范围。 |
using_list |
using子句。 |
- |
condition |
一个返回boolean值的表达式,用于判断哪些行需要被删除。 |
- |
WHERE CURRENT OF cursor_name |
当前不支持,仅保留语法接口。 |
- |
output_expr |
DELETE命令删除行之后计算输出结果的表达式。该表达式可以使用表的任意字段。可以使用*返回被删除行的所有字段。 |
- |
output_name |
一个字段的输出名称。 |
字符串,符合标识符命名规范。详情请参见标识符命名规范。 |
示例
创建表tpcds.customer_address_bak:
1
|
CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.customer_address; |
删除tpcds.customer_address_bak中ca_address_sk小于14888的职员:
1
|
DELETE FROM tpcds.customer_address_bak WHERE ca_address_sk < 14888; |
删除tpcds.customer_address_bak中ca_address_sk为14891,14893和14895的职员:
1
|
DELETE FROM tpcds.customer_address_bak WHERE ca_address_sk in (14891,14893,14895); |
删除tpcds.customer_address_bak中所有数据:
1
|
DELETE FROM tpcds.customer_address_bak; |
先通过子查询(删除行存表tpcds.warehouse_t30)得到一张临时表temp_t,然后查询临时表temp_t中的所有数据:
1
|
WITH temp_t AS (DELETE FROM tpcds.warehouse_t30 RETURNING *) SELECT * FROM temp_t ORDER BY 1; |
删除分区表test_range_row的指定分区p1:
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE TABLE test_range_row(a int, d int) DISTRIBUTE BY hash(a) PARTITION BY RANGE(d) ( PARTITION p1 values LESS THAN (60), PARTITION p2 values LESS THAN (75), PARTITION p3 values LESS THAN (90), PARTITION p4 VALUES LESS THAN (maxvalue) ); INSERT OVERWRITE INTO test_range_row PARTITION(p1) VALUES(55,51); INSERT OVERWRITE INTO test_range_row PARTITION(p3) VALUES(85,80); DELETE FROM test_range_row PARTITION(p1); |