#DELETE

# 通用描述

DELETE用于执行对数据库的表的删除记录操作,包括HEAP表、TAC表和LSC表。

在DELETE的事务(Transaction)被提交(Commit)之前,其他会话仍可以查询到这些被删除的数据。在YashanDB里,可以通过打开自动提交(SET AUTOCOMMIT ON)的开关,这样其他会话将不会查询到这些数据。

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

# 语句定义

delete::=

syntax
DELETE hint FROM table_reference WHERE condition

table_reference::=

syntax
schema . table @ database_link partition_extension_clause t_alias

partition_extension_clause::=

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

# hint

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

# table_reference

该语句用于指定要删除记录的对象,及表(包括本地数据库的表或者通过在表名后面加@database_link指定远程数据库的表,其中database_link为本地数据库到远程数据库建立的database link名字)或表分区。

当该语句用于指定要删除记录的对象是通过@database_link指定远程数据库的表,有如下限制:

1.filter与删除本地数据库的对象的filter相比,有如下限制:

  • 不支持使用UDT。
  • 不支持使用子查询。

2.不支持多表delete。

3.不支持显示指定分区。

对于分区类型的表,如未显式指定分区对象,由系统根据分区项字段的值判断要删除记录所在的表分区。在显式指定时,要删除的记录须存在于指定的分区中,否则无法删除成功。

# partition_extension_clause

INSERT语句中partition_extension_clause的描述一致。

# t_alias

定义别名。

# where condition

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

示例1

DELETE FROM area WHERE area_no='08';
 
--orders_info表的p_orders_info_1分区中包含如下四条记录
SELECT * 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 * 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

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

--查看area_no为'04'对应的子表记录
SELECT * 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 * FROM branches WHERE area_no='04';
BRANCH_NO BRANCH_NAME                                                      AREA_NO ADDRESS                                                          
--------- ---------------------------------------------------------------- ------- ----------------------------------------------------------------