DELETE
功能描述
从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行,结果只保留表结构。
注意事项
- 要删除表中的数据,用户必须对它有DELETE权限。同样也必须有USING子句引用的表以及condition上读取的表的SELECT权限。
- 对于复制表,仅支持两种场景下的DELETE操作:
- 有主键约束的场景。
- 执行计划能下推的场景。
- 对于列存表,暂时不支持RETURNING子句。
- 避免使用UPDATE/DELETE大批量刷新和删除数据,考虑使用TRUNCATE PARTITION/DROP PARTITION代替。
- 更多开发设计规范参见总体开发设计规范。
语法格式
1 2 3 4 5 |
[ WITH [ RECURSIVE ] with_query [, ...] ] DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ] [ 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语句。
- ONLY
如果指定ONLY则只有该表被删除;如果没有声明,则该表和它的所有子表将都被删除。
- table_name
目标表的名字(可以有模式修饰)。
取值范围:已存在的表名。
- alias
目标表的别名。
取值范围:字符串,符合标识符命名规范。
- using_list
using子句。
- condition
一个返回boolean值的表达式,用于判断哪些行需要被删除。
- WHERE CURRENT OF cursor_name
当前不支持,仅保留语法接口。
- output_expr
DELETE命令删除行之后计算输出结果的表达式。该表达式可以使用表的任意字段。可以使用*返回被删除行的所有字段。
- output_name
一个字段的输出名称。
取值范围:字符串,符合标识符命名规范。
示例
创建range分区表customer_address_bak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DROP TABLE IF EXISTS customer_address_bak; CREATE TABLE customer_address_bak ( ca_address_sk INTEGER NOT NULL , ca_address_id CHARACTER(16) NOT NULL , ca_street_number CHARACTER(10) , ca_street_name CHARACTER varying(60) , ca_street_type CHARACTER(15) , ca_suite_number CHARACTER(10) ) DISTRIBUTE BY HASH (ca_address_sk) PARTITION BY RANGE(ca_address_sk) ( PARTITION P1 VALUES LESS THAN(2450815), PARTITION P2 VALUES LESS THAN(2451179), PARTITION P3 VALUES LESS THAN(2451544), PARTITION P4 VALUES LESS THAN(MAXVALUE) ); |
删除customer_address_bak中ca_address_sk小于14888的数据员:
1
|
DELETE FROM customer_address_bak WHERE ca_address_sk < 14888; |
删除customer_address_bak中ca_address_sk为14891,14893和14895的数据:
1
|
DELETE FROM customer_address_bak WHERE ca_address_sk in (14891,14893,14895); |
删除customer_address_bak中所有数据:
1
|
DELETE FROM customer_address_bak; |