DELETE

从表中移除指定的行并返回已删除的行的计数。0 的计数并非错误,而是表示没有任何一行符合条件。未限定的 DELETE 语句(省略 WHERE 子句的语句)会移除所有行但留下完整的表列、投影和约束。

DELETE 支持子查询和联接,这样您可以基于其他表中的值删除某个表中的值。

语法

DELETE [ /*+LABEL (label‑string)*/ ]  FROM [[database.]schema.]table [ where-clause ]

参数

LABEL

将标签分配到语句,以便您可以在分析和调试时识别它。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

包括临时表格在内的任何表格。
where‑clause
要标记删除的行。如果省略此子句,DELETE 操作将根据永久和临时表而有所差异。有关详细信息,请参阅下文。

特权

表所有者或用户 WITH GRANT OPTION 是授予者。

  • 对表的 DELETE 权限

  • 目标表架构的 USAGE 权限

  • DELETE 语句包含用于指定表列的 WHERESET 子句时,对某个表的 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 一样,会从存储空间中移除所有行。

示例

以下语句将从临时表中移除所有行:

=> DELETE FROM temp1;

以下语句将从满足条件的架构限定表中删除所有记录:

=> DELETE FROM retail.customer WHERE state IN ('MA', 'NH');

有关显示如何在 DELETE 语句中嵌套子查询的示例,请参阅 UPDATE 和 DELETE 中的子查询

另请参阅