#DELETE
# 通用描述
DELETE用于删除数据库的表或视图的基表中的记录。
基于视图对其基表删除记录时,约束如下:
- 不适用于分布式部署。
- 目标视图需满足如下条件:
- 视图的所有基表均为HEAP表,且视图不包含分组、聚合、去重、ROWNUM或CONNECT BY操作。
- 视图中来自同一个基表的数据ROWID唯一。
- 多基表视图中,要求某个基表存在列与其他所有基表的主键约束或唯一约束列都具备等值连接条件,才能基于视图DELETE该表数据。
默认情况下,在DELETE的事务(Transaction)被提交(Commit)前,其他会话仍可以查询到被删除的数据,可以按需开启自动提交(SET AUTOCOMMIT ON)及时杜绝其他会话访问被删除的废弃数据。
对于被子表定义了外键约束的父表,如果要被删除的外键列项数据值已在子表中存在,则无法删除该父表的此行数据(除非该外键约束被定义了ON DELETE),详细描述请参考通用SQL语法constraint的FOREIGN KEY。
# 语句定义
delete::=
table_reference::=
partition_extension_clause::=
# hint
该语句用于提出给定的方案到优化器(Optimizer),使其按照此方案生成语句的执行计划。查看hint说明。
# table_reference
该语句用于指定要删除记录的对象,可以为表名称(包括本地数据库的表或远端表)、表分区名称或视图名称。
# dblink
该语句表示要删除的是远端表,详细说明参见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
--------- ---------------------------------------------------------------- ------- ----------------------------------------------------------------