DELETE
从表中移除指定的行并返回已删除的行的计数。0 的计数并非错误,而是表示没有任何一行符合条件。未限定的 DELETE 语句(省略 WHERE 子句的语句)会移除所有行但留下完整的表列、投影和约束。
DELETE 支持子查询和联接,这样您可以基于其他表中的值删除某个表中的值。
重要
Vertica 的 DELETE 实现不同于传统数据库:它不会从磁盘存储中删除数据,而是将行标记为已删除,以便它们可用于历史查询。删除的数据仍保留在磁盘上,并计入磁盘配额,直到其被清除。语法
DELETE [ /*+LABEL (label‑string)*/ ] FROM [[database.]schema.]table [ where-clause ]
参数
-
LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。- 表
- 包括临时表格在内的任何表格。
- where‑clause
- 要标记删除的行。如果省略此子句,DELETE 操作将根据永久和临时表而有所差异。有关详细信息,请参阅下文。
特权
表所有者或用户 WITH GRANT OPTION 是授予者。
-
对表的 DELETE 权限
-
目标表架构的 USAGE 权限
-
当 DELETE 语句包含用于指定表列的 WHERE 或 SET 子句时,对某个表的 SELECT 权限。
限制
无法对不可变表执行 DELETE 操作。
Vertica 采用 SQL-92 事务模型,因此连续的 INSERT、UPDATE 和 DELETE 语句包含在同一个事务中。您无需显式启动此事务,但必须使用 COMMIT 显式结束它,或者使用 COPY 隐式结束它。否则,Vertica 将放弃在该事务中所做的所有更改。
持久表和临时表
从持久表中删除数据时,DELETE 会直接从 ROS 中移除数据。
对临时表执行的 DELETE 操作会有所不同,具体取决于表是通过 ON COMMIT DELETE ROWS(默认)还是 ON COMMIT PRESERVE ROWS 创建的:
-
如果 DELETE 包含用于指定待移除行的 WHERE 子句,则操作是相同的:DELETE 标记待删除的行。在这两种情况下,您都无法回退到更早的保存点。
-
如果 DELETE 省略 WHERE 子句,且该表通过 ON COMMIT PRESERVE ROWS 创建,Vertica 会标记所有待删除的表行。如果表是通过 ON COMMIT DELETE ROWS 创建的,DELETE 操作和 TRUNCATE TABLE 一样,会从存储空间中移除所有行。
注意
如果您对通过 ON COMMIT DELETE ROWS 创建的临时表发出未限定的 DELETE 语句,Vertica 将从存储空间中移除所有行但不会结束事务。
示例
以下语句将从临时表中移除所有行:
=> DELETE FROM temp1;
以下语句将从满足条件的架构限定表中删除所有记录:
=> DELETE FROM retail.customer WHERE state IN ('MA', 'NH');
有关显示如何在 DELETE 语句中嵌套子查询的示例,请参阅 UPDATE 和 DELETE 中的子查询。