【发布时间】:2012-09-16 07:55:16
【问题描述】:
我最近遇到了一个怪事。以下是有效的 SQL:
DELETE FROM customer *;
PostgreSQL DELETE 的文档说星号是output_expression 的可能值:
DELETE 命令计算并返回的表达式 每一行都被删除。表达式可以使用任何列名 USING 中列出的一个或多个表。写 * 以返回所有列。
我在有和没有星星的情况下都试过了,看不出有什么区别。事实上,我可以在表名之后放置任何单个单词并且它被接受。它甚至不必是实际的列名。不返回任何额外内容。
db=> DELETE FROM customer wheeeeeee;
DELETE 19
那么它有什么作用,我可以用它做什么?
【问题讨论】:
-
我做到了。它只是删除行并且没有返回任何特殊内容。
-
看起来你错过了
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