#DELETE

# 通用描述

DELETE用于删除数据库的表或视图的基表中的记录。

基于视图对其基表删除记录时,约束如下:

  • 不适用于分布式部署。
  • 目标视图需满足如下条件:
    • 视图的所有基表均为HEAP表,且视图不包含分组、聚合、去重、ROWNUM或CONNECT BY操作。
    • 视图中来自同一个基表的数据ROWID唯一。
    • 多基表视图中,要求某个基表存在列与其他所有基表的主键约束或唯一约束列都具备等值连接条件,才能基于视图DELETE该表数据。

默认情况下,在DELETE的事务(Transaction)被提交(Commit)前,其他会话仍可以查询到被删除的数据,可以按需开启自动提交(SET AUTOCOMMIT ON)及时杜绝其他会话访问被删除的废弃数据。

对于被子表定义了外键约束的父表,如果要被删除的外键列项数据值已在子表中存在,则无法删除该父表的此行数据(除非该外键约束被定义了ON DELETE),详细描述请参考通用SQL语法constraint的FOREIGN KEY。

# 语句定义

delete::=

syntax
DELETE hint FROM table_reference WHERE condition

table_reference::=

syntax
schema . table_name dblink partition_extension_clause view_name t_alias

partition_extension_clause::=

syntax
PARTITION ( partition ) FOR ( partition_key_value , ) SUBPARTITION ( subpartition ) FOR ( subpartition_key_value , )

# hint

该语句用于提出给定的方案到优化器(Optimizer),使其按照此方案生成语句的执行计划。查看hint说明

# table_reference

该语句用于指定要删除记录的对象,可以为表名称(包括本地数据库的表或远端表)、表分区名称或视图名称。

该语句表示要删除的是远端表,详细说明参见dblink

# partition_extension_clause

INSERT语句中partition_extension_clause的描述一致。

未指定本语句时,对分区表,由系统根据分区键字段的值判断要删除记录所在的表分区。

指定本语句时,要删除的记录须存在于指定的分区中,否则无法删除成功。

# t_alias

定义别名。

# where condition

该语句用于指定condition,按此条件过滤出的记录行被执行删除操作。可省略,则表示删除表的所有行,但该表及表上索引所占的数据空间仍然被保留。

示例1

DELETE FROM area WHERE area_no='08';

示例2(单机/共享集群部署)

-- orders_info表的p_orders_info_1分区中包含如下四条记录
SELECT order_no,product_no,area,branch,order_date,salesperson,id FROM orders_info PARTITION (p_orders_info_1);
ORDER_NO          PRODUCT_NO AREA  BRANCH ORDER_DATE                       SALESPERSON            ID 
----------------- ---------- ----- ------ -------------------------------- ------------- ----------- 
20010102020001    11001      02    0201   2022-05-01 22:55:32              0201010011            300
20210102020002    11001      02    0201   2022-05-01 22:55:32              0201008003            400
20210102020002    11002      02    0201   2022-05-01 22:55:32              0201010011            200
20210102020002    10001      02    0201   2022-05-01 22:55:32              0201008003            100
 
-- 删除指定分区的指定记录
DELETE FROM orders_info PARTITION(p_orders_info_1) WHERE ID=300;
 
-- result
SELECT order_no,product_no,area,branch,order_date,salesperson,id FROM orders_info PARTITION (p_orders_info_1);
ORDER_NO          PRODUCT_NO AREA  BRANCH ORDER_DATE                       SALESPERSON            ID 
----------------- ---------- ----- ------ -------------------------------- ------------- ----------- 
20210102020002    11001      02    0201   2022-05-01 22:55:32              0201008003            400
20210102020002    11002      02    0201   2022-05-01 22:55:32              0201010011            200
20210102020002    10001      02    0201   2022-05-01 22:55:32              0201008003            100

示例2(HEAP表)

-- branches为HEAP表,其area_no字段上存在CONSTRAINT c_branches_1 REFERENCES area(area_no) ON DELETE SET NULL外键约束定义

-- 查看area_no为'04'对应的子表记录
SELECT branch_no,branch_name,area_no,address FROM branches WHERE area_no='04';
BRANCH_NO BRANCH_NAME             AREA_NO ADDRESS          
--------- ----------------------- ------- -----------------
0401      北京                     04                         
0402      天津                     04                         
0403      大连                     04      大连市             
0404      沈阳                     04   
 
-- 对父表area执行删除 
DELETE FROM area WHERE area_no='04';
COMMIT;

-- 子表相应字段值被置为NULL
SELECT branch_no,branch_name,area_no,address FROM branches WHERE area_no='04';
BRANCH_NO BRANCH_NAME                                                      AREA_NO ADDRESS                                                          
--------- ---------------------------------------------------------------- ------- ----------------------------------------------------------------