
# 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](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0120.html#ZH-CN_TOPIC_0000002558805315)章节介绍。
  
- **view_name**
  目标视图的名称。
  ![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  对视图的删除，有如下约束：
  - 只有直接引用基表用户列的列可进行DELETE操作。
  
  - 视图必须至少包含一个可更新列，关于可更新列请参见[CREATE VIEW](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0081.html#ZH-CN_TOPIC_0000002558805291)。
  
  - 不支持在顶层包含DISTINCT、GROUP BY、HAVING、LIMIT、OFFSET子句的视图。
  
  - 不支持在顶层包含集合运算（UNION以及EXCEPT）的视图。
  
  - 不支持目标列表中包含聚集函数、窗口函数、返回集合函数（array_agg、json_agg、generate_series等）的视图。
  
  - 视图中支持的表类型包括普通表、临时表、全局临时表、分区表、ustore表、astore表。
  
  - 连接视图只能对视图中的保留键表做删除操作，如果只存在一张保留键表，则删除该表数据，如果存在多张保留键表，仅删除FROM后的第一张保留键表的数据。关于保留键表请参见[CREATE VIEW](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0081.html#ZH-CN_TOPIC_0000002558805291)。
  
  - 不支持对系统视图进行DELETE操作。
    
- **NULLS FIRST**
  指定空值在排序中排在非空值之前，当指定DESC排序时，本选项为默认的。
  
- **NULLS LAST**
  指定空值在排序中排在非空值之后，未指定DESC排序时，本选项为默认的。
  
- **condition**
  一个返回Boolean值的表达式，用于判断哪些行需要被删除。不建议使用int等数值类型作为condition，因为int等数值类型可以隐式转换为bool值（非0值隐式转换为true，0转换为false），可能导致非预期的结果。
  
- **ORDER BY**
  关键字详见[SELECT](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0120.html#ZH-CN_TOPIC_0000002558805315)章节介绍。
  
- **LIMIT**
  关键字详见[SELECT](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0120.html#ZH-CN_TOPIC_0000002558805315)章节介绍。
  
- **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
  ```
  
 
#### 优化建议
- delete 如果要删除表中的所有记录，建议使用truncate语法。
  
 
