为什么我看不到表的列名?

Mic*_*ard 12 postgresql

所以我以编程方式制作了一些表,我想验证它的结构是我认为的.

>Rocko=# \c Rocko
Password for user Rocko:
psql (8.4.4, server 8.4.8)
You are now connected to database "Rocko".
Rocko=# \d
            List of relations
 Schema |     Name     |   Type   | Owner
--------+--------------+----------+-------
 public | Email        | table    | Rocko
 public | Email_id_seq | sequence | Rocko
 public | Test         | table    | Rocko
 public | Test_id_seq  | sequence | Rocko
 public | User         | table    | Rocko
 public | User_id_seq  | sequence | Rocko
(6 rows)
Run Code Online (Sandbox Code Playgroud)

所以,例如,我想看看Test中的列.

Rocko=# \d Test

Did not find any relation named "Test".

等一下?!没有测试只是出现在"关系列表"下?这里发生了什么?

mu *_*ort 30

PostgreSQL默认情况下将不带引号的标识符(例如表名和列名)转换为小写; 标准说标识符应该被标准化为大写,但这在这里并不重要.所以,当你这样说时:

\d Test
Run Code Online (Sandbox Code Playgroud)

PostgreSQL认为与之相同\d test.您可能有一个使用引用名称创建的表:

create table "Test" ( ...
Run Code Online (Sandbox Code Playgroud)

因此它的名称区分大小写,并且每次引用时都必须引用(带双引号).所以试着引用这个名字:

\d "Test"
Run Code Online (Sandbox Code Playgroud)

  • 或者更好的是,**永远不会**使用双引号作为标识符**.然后你可以根据需要在你的标识符中混合使用大小写,所有内容都将折叠成小写,你将永远不必双重引用标识符或遇到像这样的错误.当然,您必须重命名以这种笨重的方式创建的现有对象.当然,你必须远离[保留字](http://www.postgresql.org/docs/9.1/interactive/sql-keywords-appendix.html) - 无论如何你都应该这样做. (3认同)
  • 感谢上帝的小怜悯.;) (2认同)