11

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

DELETE FROM customer *;

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

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

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

db=> DELETE FROM customer wheeeeeee;
DELETE 19

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

问题也发布在 PostgreSQL 邮件列表上

4

1 回答 1

5

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

由于 PostgreSQL 7.1 这是默认设置(除非sql_inheritance设置为 off),并且ONLY关键字用于相反,所以 * 不是很有用。

请参阅PostgreSQL 邮件列表上 Tom Lane 的这篇解释性帖子

于 2012-09-16T12:59:20.747 回答