PostgreSQL:查询“select * from user”实际上是在做什么?

11

在psql中,如果输入“select * from user”,你会得到以下类似的结果:

 current_user 
--------------
 postgres

在这个上下文中,“user”是什么意思?


1
"select user;" 返回相同的结果集,而执行 "select user,* from some_table;" 则会在结果集中返回一个名为 "current_user" 的附加列。所以对我来说它的行为非常奇怪。 - Martin Smith
尽管使用current_timestamp会发生相同的行为。猜测Postgres在如何使用函数方面非常灵活。 - Martin Smith
1
@MartinSmith:灵活?你能使用 SELECT user() 吗? - ypercubeᵀᴹ
@KenWhite如果人们没有回答问题,那就是没有回答问题。我对此无能为力。 - rpkelly
3个回答

20
在这种情况下,user 是保留的内部Postgres函数,表示当前登录到数据库中的用户。
此查询也可以写成: SELECT user; 这应该会产生相同的结果。请注意,如果您想引用或创建名为user的表,您必须使用引号或完全限定它所在的架构。例如:
CREATE TABLE "user"
(
  id int2 not null
);

这样写是可以的,但有以下问题:

CREATE TABLE user
(
  id int2 not null
);

会产生错误。

以下是其他系统信息函数的参考:

http://www.postgresql.org/docs/9.0/static/functions-info.html


(因为我对Postgres的了解很少,所以很好奇:)它是内部变量还是内部表? - ypercubeᵀᴹ
Postgres的user文档在此处 - Martin Smith
@ypercube - 文档似乎将其称为“系统信息函数”,但它的行为更像内置变量。也就是说,您不需要在其后加上 (),并且可以通过 SET 命令进行更改。 - Mike Christensen
@ypercube - 感谢你给了我一个挖掘PG系统数据库进行调查的借口。如果您仍需要非常深入的技术解释,我建议您发送电子邮件至postgresql.orgpgsql-general,我一直发现他们非常乐于助人。 - Mike Christensen

3

请参阅Postgresql文档中的系统函数

基本上,"select * from user"是查找当前用户的Postgresql特定方式之一。它在功能上与使用current_user函数相同,例如:"select current_user()"。

其他可用作查询表格的特殊函数包括:

current_catalog
current_schema

实际上,我认为这些函数并没有什么特别之处(除了不需要括号)。SELECT 被定义为接受函数名(http://www.postgresql.org/docs/8.0/static/sql-select.html)。例如,`SELECT * from version();` 可以正常工作。 - Martin Smith

1

如果您正在寻找要查找的pg_user表中的用户列表; SELECT * FROM pg_user;

您的查询将获取名为user的特殊函数结果的所有数据。该函数返回当前用户的用户名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接