【问题标题】:What does the output_expression for "DELETE FROM table" do?“DELETE FROM table”的 output_expression 有什么作用?
【发布时间】:2012-09-16 07:55:16
【问题描述】:

我最近遇到了一个怪事。以下是有效的 SQL:

DELETE FROM customer *;

PostgreSQL DELETE 的文档说星号是output_expression 的可能值:

DELETE 命令计算并返回的表达式 每一行都被删除。表达式可以使用任何列名 USING 中列出的一个或多个表。写 * 以返回所有列。

我在有和没有星星的情况下都试过了,看不出有什么区别。事实上,我可以在表名之后放置任何单个单词并且它被接受。它甚至不必是实际的列名。不返回任何额外内容。

db=> DELETE FROM customer wheeeeeee;
DELETE 19

那么它有什么作用,我可以用它做什么?

问题also posted on the PostgreSQL mailing list

【问题讨论】:

  • 我做到了。它只是删除行并且没有返回任何特殊内容。
  • 看起来你错过了RETURNING,这是output_expression 之前语法的非可选部分我认为* 只是被视为别名(对于wheeeeeee)没有它。
  • 我已经删除了我的答案,因为我实际上不确定* 是否被视为别名。然后不可能在WHERE 子句和可选的AS 关键字中使用它,即DELETE FROM customer AS * 失败并出现语法错误。
  • @BarryBrown - 从实验中我认为令牌可能被接受,就好像它是该特定查询中的别名一样,但它实际上并没有以任何方式被视为别名。 DELETE FROM customer * WHERE customer.id=1 有效。如果它完全被视为别名,那么引用 customer 应该会失败,因为它会被隐藏。似乎也是* 特有的行为。例如尝试+ 失败。不看源代码就不确定到底发生了什么。
  • Tom Lane 在 PostgreSQL 邮件列表中解释了这一点,以回复该问题的转贴。见archives.postgresql.org/message-id/…。我添加了@MichalPolitowski 答案的链接,以确保没有人错过它。

标签: sql postgresql sql-delete


【解决方案1】:

星号是not output_expression,为此您必须使用RETURNING 关键字。相反,它是一种旧的、过时的语法,用于在查询中包含子表。 (它记录的最后一个版本似乎是PostgreSQL 8.1。由于语法仍然有效,它是一个文档错误,正如 Tom Lane 在下面链接的帖子中指出的那样。)

从 PostgreSQL 7.1 开始,这是默认设置(除非 sql_inheritance 设置为关闭),而 ONLY 关键字用于相反,因此 * 不是很有用。

this explanatory post from Tom Lane on the PostgreSQL mailing list

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-01-14
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多