#DELETE

# 通用描述

DELETE用于执行对数据库的表的删除记录操作,包括HEAP表、TAC表和LSC表,其中,只能删除LSC表可变数据区的MCOL数据,已转换为SCOL结构的稳态数据不允许删除。

在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 partition_extension_clause t_alias

partition_extension_clause::=

syntax
PARTITION ( partition_name ) FOR ( partition_key_value , )

# hint

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

# table_reference

该语句用于指定要删除记录的对象,及表或表分区。

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

# 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                                                          
--------- ---------------------------------------------------------------- ------- ----------------------------------------------------------------