400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
工具指南
数据类型
存储引擎
执行引擎
系统配置参数
SQL 参考
常见问题(FAQ)
新架构 FAQ
集群部署 FAQ
SQL 查询 FAQ
MatrixGate FAQ
运维 FAQ
监控告警 FAQ
PXF FAQ
PLPython FAQ
性能 FAQ
从表中删除行。
[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ONLY] table [[AS] alias]
[USING usinglist]
[WHERE condition | WHERE CURRENT OF cursor_name]
[RETURNING * | output_expression [[AS] output_name] [, …]]
DELETE 从指定的表中删除满足 WHERE 子句的行。 如果 WHERE 子句不存在,则结果是删除表中的所有行。 结果是一个有效但空的表。
默认情况下,DELETE 将删除指定表及其所有子表中的行。 如果只希望从提到的特定表中删除,则必须使用 ONLY 子句。
使用数据库中其他表中包含的信息删除表中的行有两种方法:使用子选择,或在 USING 子句中指定其他表。 哪种技术更合适取决于具体情况。
如果指定了 WHERE CURRENT OF 子句,则删除的行是从指定游标中最新获取的行。
复制表不支持 WHERE CURRENT OF 子句。
可选的 RETURNING 子句使 DELETE 根据实际删除的每一行计算并返回值。 可以计算使用该表的列和/或 USING 中提到的其他表的列的任何表达式。 RETURNING 列表的语法与 SELECT 的输出列表的语法相同。
您必须对表具有 DELETE 特权才能从中删除。
注意:默认情况下,YMatrix 数据库为堆表上的 DELETE 操作获取表上的 EXCLUSIVE 锁。 启用全局死锁检测器后,堆表上 DELETE 操作的锁定模式为 ROW EXCLUSIVE。
成功完成后,DELETE 命令将返回以下形式的命令标签:
DELETE count
count 是已删除的行数。 如果 count 为 0,则查询没有删除任何行(这不视为错误)。
如果 DELETE 命令包含 RETURNING 子句,则结果将类似于 SELECT 语句的结果, 该 SELECT 语句包含 RETURNING 列表中定义的列和值,该列和值是在该命令删除的行上计算的。
with_query
ONLY
table
alias
usinglist
condition
cursor_name
output_expression
output_name
YMatrix 数据库允许您通过在 USING 子句中指定其他表来引用 WHERE 条件下其他表的列。 例如,从 rank 表中将其命名为 Hannah,可以这样做:
DELETE FROM rank USING names WHERE names.id = rank.id AND
name = 'Hannah';
这里实际上发生的是 rank 和 names 之间的联接,所有成功联接的行都标记为删除。 此语法不是标准语法。但是,这种连接样式通常比更标准的子选择样式更易于编写和执行,例如:
DELETE FROM rank WHERE id IN (SELECT id FROM names WHERE name
= 'Hannah');
当使用 DELETE 删除表的所有行时(例如:DELETE * FROM table;), YMatrix 数据库会添加一个隐式的 TRUNCATE 命令(当用户权限允许时)。 添加的 TRUNCATE 命令释放被删除的行占用的磁盘空间,而无需对表进行 VACUUM。 这提高了后续查询的扫描性能,并使经常在临时表中插入和删除的 ELT 工作负载受益。
不支持在分区表的特定分区(子表)上直接执行 UPDATE 和 DELETE 命令。 而是必须在根分区表(使用 CREATE TABLE 命令创建的表)上执行这些命令。
删除除 musicals 外的所有 films:
DELETE FROM films WHERE kind <> 'Musical';
清除表 films:
DELETE FROM films;
删除已完成的任务,返回已删除行的完整详细信息:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
使用联接删除:
DELETE FROM rank USING names WHERE names.id = rank.id AND
name = 'Hannah';
该命令符合 SQL 标准,不同之处在于 USING 和 RETURNING 子句是 YMatrix 数据库扩展, 以及将 WITH 和 DELETE 一起使用的功能。