#DELETE
# 通用描述
DELETE用于执行对数据库的表的删除记录操作,包括HEAP表、TAC表和LSC表,其中,只能删除LSC表可变数据区的MCOL数据,已转换为SCOL结构的稳态数据不允许删除。
在DELETE的事务(Transaction)被提交(Commit)之前,其他会话仍可以查询到这些被删除的数据。在YashanDB里,可以通过打开自动提交(SET AUTOCOMMIT ON)的开关,这样其他会话将不会查询到这些数据。
对于被子表定义了外键约束的父表,如果要被删除的外键列项数据值已在子表中存在,则无法删除该父表的此行数据(除非该外键约束被定义了ON DELETE),详细描述请参考通用SQL语法constraint的FOREIGN KEY。
# 语句定义
delete::=
table_reference::=
partition_extension_clause::=
# 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
--------- ---------------------------------------------------------------- ------- ----------------------------------------------------------------