PostgreSQL 从选定的行中删除行

⚡ 智能摘要

PostgreSQL DELETE 语句会从表中删除一行或多行,如果与 WHERE 子句一起使用,则只会删除符合条件的记录,而省略 WHERE 子句则会清除表中的所有行。

  • 📋 语法: DELETE FROM table WHERE 条件删除匹配的行,RETURNING 可以回显已删除的数据。
  • 🎯 一个条件: 单个 WHERE 子句只会删除满足一个条件的行。
  • 两个条件: 使用 AND 连接两个测试,可以将删除范围缩小到特定的行。
  • 🔗 EXISTS 子句: EXISTS 函数根据另一个表中的匹配记录删除一个表中的行。
  • 🖥️ pgAdmin: 同样的删除查询可以通过 pgAdmin 查询编辑器以可视方式运行。
  • 🤖 人工智能安全: AI 助手会添加正确的 WHERE 子句,并在删除整表之前发出警告。

PostgreSQL 从选定的表中删除行

删除查询 PostgreSQL

删除语句 in PostgreSQL 用于从表中删除一条或多条记录。要仅从表中删除选定的行, PostgreSQL 允许您将 DELETE 语句与 WHERE 子句结合使用;否则,它将删除表中的所有记录。

PostgreSQL 删除查询语法

可以使用以下语法定义 DELETE 语句:

[ WITH [ RECURSIVE ] with-query [, ...] ]
DELETE FROM [ ONLY ] table-name [ * ] [ [ AS ] alias ]
    [ USING using-list ]
    [ WHERE condition(s) | WHERE CURRENT OF cursor-name]
    [ RETURNING * | output-expression [ [ AS ] output-name] [, ...] ]

参数

可使用的参数如下:

  • 带查询WITH 子句允许您在 DELETE 查询中按名称引用一个或多个子查询。
  • 表名:要从中删除记录的表的名称。
  • 别号:目标表名称的替代项。
  • 使用列表:允许在 WHERE 子句中使用其他表中的列的表表达式。
  • 状况):可选。这些是删除记录必须满足的条件。如果未提供此部分,则将删除所有表名记录。
  • 游标名称:用于 WHERE CURRENT OF 条件的游标。此游标获取的最后一行将被删除。
  • 输出表达式:每次删除行后,DELETE 语句要处理并返回的表达式。
  • 输出名称:返回列所使用的名称。

请注意,由于 DELETE 语句会删除整行,因此无需指定列名。

PostgreSQL 删除具有一个条件的查询

DELETE 语句可以与单个条件一起使用,该条件由 WHERE 子句设置。考虑以下包含以下数据的 Price 表:

价格:

PostgreSQL 删除具有一个条件的查询

让我们删除 id 为 4 的记录:

DELETE FROM Price
WHERE id = 4;

上述命令会删除 id 为 4 的记录。让我们确认一下删除是否成功:

PostgreSQL 删除具有一个条件的查询

id 为 4 的行已被删除。

带两个条件的删除查询

此 PostgreSQL DELETE 语句也可以接受两个条件。这两个条件应该使用 AND 运算符连接。我们将使用下表:

价格:

PostgreSQL 带两个条件的删除查询

考虑下面给出的例子:

DELETE FROM Price
WHERE id = 3
AND price = 300;

上述命令删除了 id 为 3 且价格为 300 的行。现在我们可以查询该表:

SELECT * FROM Price;

这将返回以下内容:

PostgreSQL 带两个条件的删除查询

删除了id为3,价格为300的记录。

PostgreSQL 使用 EXISTS 条件删除查询

随着 EXISTS 如果存在某些情况,您可以使 DELETE 语句更加复杂。有时可能需要根据另一个表中的记录来删除一个表中的记录。

由于 FROM 子句不允许在执行删除操作时列出来自多个表的记录,因此 EXISTS 子句就非常有用。我们有以下两个表:

书:

PostgreSQL 使用 EXISTS 条件删除查询

价格:

PostgreSQL 使用 EXISTS 条件删除查询

然后我们可以运行以下查询:

DELETE FROM Book
WHERE EXISTS
  (SELECT 1
    FROM Price
    WHERE Price.id = Book.id
    AND price < 250 );

该命令从 Book 表中删除 Price 表中 id 与价格表匹配且价格低于 250 的行。

Book 表现在如下:

PostgreSQL 使用 EXISTS 条件删除查询

id为1的记录已被删除。

如何删除一行 PostgreSQL 使用 pgAdmin

也可以通过 pgAdmin 界面以可视化方式运行相同的删除查询,具体步骤如下:

有一个条件

步骤1) 登录您的pgAdmin帐户。打开pgAdmin并使用您的凭据登录您的帐户。

步骤2) 创建演示数据库。

  1. 在左侧的导航栏中,单击数据库。
  2. 单击“演示”。

删除行 PostgreSQL 使用 pgAdmin

步骤3) 在查询编辑器中输入以下查询:

DELETE FROM Price
WHERE id = 4;

步骤4) 单击执行按钮。

删除行 PostgreSQL 使用 pgAdmin

步骤5) 让我们检查一下该行是否已被删除:

删除行 PostgreSQL 使用 pgAdmin

两个条件

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  1. 在左侧的导航栏中,单击数据库。
  2. 单击“演示”。

删除行 PostgreSQL 使用 pgAdmin

步骤3) 在查询编辑器中输入查询:

DELETE FROM Price
WHERE id = 3
AND price = 300;

步骤4) 单击执行按钮。

删除行 PostgreSQL 使用 pgAdmin

步骤5) 让我们检查一下删除是否成功:

删除行 PostgreSQL 使用 pgAdmin

使用 EXISTS 条件

步骤1) 登录您的 pgAdmin 帐户。

步骤2)

  1. 在左侧的导航栏中,单击数据库。
  2. 单击“演示”。

在 pgAdmin 中使用 EXISTS 条件删除行

步骤3) 在查询编辑器中输入查询:

DELETE FROM Book
WHERE EXISTS
  (SELECT 1
    FROM Price
    WHERE Price.id = Book.id
    AND price < 250 );

步骤4) 单击执行按钮。

在 pgAdmin 中使用 EXISTS 条件删除行

步骤5) 让我们检查一下删除是否成功:

在 pgAdmin 中使用 EXISTS 条件删除行

下载本教程使用的数据库

常见问题

TRUNCATE 会立即删除所有行并重置存储,但会忽略 WHERE 子句和每行触发器。DELETE 会使用 WHERE 子句删除选定的行,触发行触发器,并且可以在事务中回滚。

添加 USING 子句:DELETE FROM member USING denylist WHERE member.phone = denylist.phone。它连接第二个表并删除匹配的行,得到与 EXISTS 相同的结果,但语法更清晰。

RETURNING 语句会返回刚刚在同一条语句中删除的行的列。例如,DELETE FROM Price WHERE id = 4 RETURNING *,以及 PostgreSQL 返回已删除的数据,以便应用程序可以记录或确认更改。

是的。将 DELETE 操作包装在一个以 BEGIN 开头的事务中,然后运行 ​​ROLLBACK 撤销该操作,或运行 COMMIT 保留该操作。在提交之前,已删除的行可以被恢复,这可以防止误删。

使用隐藏的 ctid 列,每个组保留一份副本:DELETE FROM Price a USING Price b WHERE a.ctid < b.ctid AND a.id = b.id。这将删除重复行,同时保留一条记录。

首先运行与 SELECT 相同的筛选器,或者打开一个带有 BEGIN 的事务,并使用 RETURNING 来检查受影响的行。 Rev在提交之前查看 WHERE 结果可以防止删除超出预期的行数。

AI 助手可以将纯英文规则翻译成带有正确 WHERE 子句的 DELETE 语句,建议使用 EXISTS 或 USING 进行跨表删除,并标记缺少条件、会清除整个表的语句。

是的。AI 助手会审查每个 DELETE 操作,在缺少 WHERE 子句时发出警告,并建议进行事务处理或返回预览,从而降低意外删除整表的风险。

总结一下这篇文章: