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)
从表中删除行。
[ 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 一起使用的功能。