DELETE
功能描述
DELETE从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行,结果只保留表结构。
注意事项
- 表的所有者、被授予表DELETE权限的用户或被授予DELETE ANY TABLE权限的用户有权删除表中数据,当三权分立开关关闭时,系统管理员默认拥有此权限。同时也必须有USING子句引用的表以及condition上读取表的SELECT权限。
- 对于子查询是STREAM计划的DELETE语句,不支持删除的行数据同时进行UPDATE更新操作。
语法格式
DELETE [/*+ plan_hint */] [IGNORE] FROM {table_name [partition_clause] | view_name}
[ WHERE condition ]
[ ORDER BY { expression [ ASC | DESC ] } [ NULLS { FIRST | LAST } ] ]
[ LIMIT { count } ]
[ RETURNING { * | { output_expr [ [ AS ] output_name ] } [, ...] } ];
参数说明
- plan_hint
以/*+ */的形式在DELETE关键字后,用于对DELETE对应的语句块生成的计划进行hint调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。
- IGNORE
DELETE语句使用IGNORE关键字时,可将部分ERROR级别的错误降级为WARNING级别,并根据不同的错误场景将无效值调整为最接近的值。GaussDB支持错误降级的场景如下:
sql_mode为宽松模式的场景。
- table_name
目标表的名称(可以有模式修饰)。
取值范围:已存在的表名。
- partition_clause
指定分区删除操作。
PARTITION { ( partition_name | subpartition_name [ , ...] )
关键字详见SELECT章节介绍。
- view_name
目标视图的名称。
对视图的删除,有如下约束:
- 只有直接引用基表用户列的列可进行DELETE操作。
- 视图必须至少包含一个可更新列,关于可更新列请参见CREATE VIEW。
- 不支持在顶层包含DISTINCT、GROUP BY、HAVING、LIMIT、OFFSET子句的视图。
- 不支持在顶层包含集合运算(UNION以及EXCEPT)的视图。
- 不支持目标列表中包含聚集函数、窗口函数、返回集合函数(array_agg、json_agg、generate_series等)的视图。
- 视图中支持的表类型包括普通表、临时表、全局临时表、分区表、ustore表、astore表。
- 连接视图只能对视图中的保留键表做删除操作,如果只存在一张保留键表,则删除该表数据,如果存在多张保留键表,仅删除FROM后的第一张保留键表的数据。关于保留键表请参见CREATE VIEW。
- 不支持对系统视图进行DELETE操作。
- NULLS FIRST
指定空值在排序中排在非空值之前,当指定DESC排序时,本选项为默认的。
- NULLS LAST
指定空值在排序中排在非空值之后,未指定DESC排序时,本选项为默认的。
- condition
一个返回Boolean值的表达式,用于判断哪些行需要被删除。不建议使用int等数值类型作为condition,因为int等数值类型可以隐式转换为bool值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。
- ORDER BY
关键字详见SELECT章节介绍。
- LIMIT
关键字详见SELECT章节介绍。
- RETURNING
返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。
示例
- 删除部分数据
--建表。 m_db=# CREATE TABLE test_t1(col1 INT,col2 INT); m_db=# INSERT INTO test_t1 VALUES (1, 1), (2, 2), (3, 3), (4, 4), (4, 6); --删除表中所有记录。 m_db=# DELETE FROM test_t1 WHERE col1 = 4; --查询。 m_db=# SELECT * FROM test_t1; col1 | col2 ------+------ 1 | 1 2 | 2 3 | 3 (3 rows) - 删除所有数据
--删除所有的数据。 m_db=# DELETE FROM test_t1; --查询。 m_db=# SELECT * FROM test_t1; col1 | col2 ------+------ (0 rows) --删除表。 m_db=# DROP TABLE test_t1;
- 删除视图
--创建SCHEMA。 m_db=# CREATE SCHEMA del_view; CREATE SCHEMA m_db=# SET CURRENT_SCHEMA = 'del_view'; SET --创建表并插入数据。 m_db=# CREATE TABLE t1 (x1 int, y1 int); CREATE TABLE m_db=# CREATE TABLE t2 (x2 int PRIMARY KEY, y2 int); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t2_pkey" for table "t2" CREATE TABLE m_db=# CREATE TABLE tdata (x INT PRIMARY KEY, y INT); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tdata_pkey" for table "tdata" CREATE TABLE m_db=# CREATE TABLE tinfo (z INT PRIMARY KEY, comm VARCHAR(20)); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tinfo_pkey" for table "tinfo" CREATE TABLE m_db=# INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3), (5, 5); INSERT 0 4 m_db=# INSERT INTO t2 VALUES (1, 1), (2, 2), (3, 3), (5, 5); INSERT 0 4 m_db=# INSERT INTO tdata VALUES (1, 1), (2, 2), (3, 3); INSERT 0 3 m_db=# INSERT INTO tinfo VALUES (1,'one'), (2, 'two'), (3, 'three'), (5, 'wrong three'); INSERT 0 4 --创建单表视图。 m_db=# CREATE VIEW v_del1 AS SELECT * FROM t1; CREATE VIEW --通过视图删除t1中的数据。 m_db=# DELETE FROM v_del1 where y1 = 3; DELETE 1 --创建多表连接视图。 m_db=# CREATE VIEW vvt1t2 AS SELECT * FROM t1, t2 WHERE x1 = x2; CREATE VIEW m_db=# CREATE VIEW vv_dup AS SELECT td1.x x1, td1.y y1, td2.x x2, td2.y y2 FROM tdata td1, tdata td2, tinfo WHERE td2.y=tinfo.z AND td1.x=td2.y; CREATE VIEW --对多表连接的视图做删除操作。 m_db=# SELECT * FROM vvt1t2; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 2 | 2 | 2 | 2 5 | 5 | 5 | 5 (3 rows) m_db=# DELETE FROM vvt1t2 WHERE y2 = 5; DELETE 1 m_db=# SELECT * FROM vvt1t2; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 2 | 2 | 2 | 2 (2 rows) m_db=# SELECT * FROM vv_dup; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 2 | 2 | 2 | 2 3 | 3 | 3 | 3 (3 rows) m_db=# DELETE FROM vv_dup WHERE y1 = 2; DELETE 1 m_db=# SELECT * FROM vv_dup; x1 | y1 | x2 | y2 ----+----+----+---- 1 | 1 | 1 | 1 3 | 3 | 3 | 3 (2 rows) --删除SCHEMA。 m_db=# DROP SCHEMA del_view; NOTICE: drop cascades to 7 other objects DETAIL: drop cascades to table t1 drop cascades to table t2 drop cascades to table tdata drop cascades to table tinfo drop cascades to view v_del1 drop cascades to view vvt1t2 drop cascades to view vv_dup DROP SCHEMA