PostgreSQL中使用user作为表别名报错问题咨询
问题原因分析
你的问题完全是表别名user的命名冲突导致的,和数据库架构无关,你对查询范围的判断是正确的。
具体原因
PostgreSQL中user是一个内置的特殊标识符(可理解为系统自带的变量/函数),执行SELECT user;就能返回当前数据库连接的用户名。当你把users表的别名设为user后,SQL解析器会优先把user识别成这个系统标识符,而非你的表别名。此时user.rating就会触发语法错误——因为系统标识符user无法通过.来引用字段,自然就出现了syntax error at or near "."的报错。
验证方式
你可以执行这条简单语句验证:
SELECT user;
它会直接返回当前登录的数据库用户名,这就说明user是PostgreSQL预留的特殊标识符,不能随意用作表别名。
解决方案
除了你已经采用的更换别名(比如改成u、usr这类),如果非要用user当别名,也可以给它加双引号,强制PostgreSQL将其视为普通标识符:
SELECT cp.contest_id, cp.username, "user".rating FROM contest_participants cp JOIN users "user" ON "user".username = cp.username WHERE contest_id = '?';
但这种写法不推荐,会降低SQL可读性,还可能引发其他潜在问题,最好还是使用非特殊名称的别名。
内容的提问来源于stack exchange,提问作者Daniel Tanase
相关产品推荐
相关产品推荐

