更新时间:2025-10-23 GMT+08:00

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

优化建议

  • delete

    如果要删除表中的所有记录,建议使用truncate语法。