已列出Postgresql表但无法选择

时间:2017-02-01 07:48:13

标签: sql postgresql select

给定postgresql数据库,当使用\d+命令时,下面的 references 表很好地列出,如您所见:

 Schema |        Name         |   Type   |   Owner  |    Size    |  
--------+---------------------+----------+----------+------------+---       
 ...
 public | references          | table    | user1    | 34 MB      |     
 public | references_id_seq   | sequence | user1    | 8192 bytes |
 ...
 (13 rows)

但是,当我尝试对其执行SELECT操作时,例如SELECT * FROM references;我收到语法错误:

ERROR:  syntax error at or near "references"
LINE 1: SELECT * FROM references;
                      ^

但是,以下工作:

SELECT pg_size_pretty(pg_total_relation_size('references'));
 pg_size_pretty 
----------------
 79 MB
(1 row)

这是一种特殊的餐桌吗?为什么它无法访问?数据库中的所有其他表都是"可选"。

作为一个侧节点,为什么大小不同(`\ d +' 34 MB,pg_size_pretty为79 MB)?

2 个答案:

答案 0 :(得分:2)

问题是REFERENCES是一个SQL关键字,用于定义外键约束:

test=> SELECT * FROM pg_get_keywords() WHERE word ILIKE 'references';
┌────────────┬─────────┬──────────┐
│    word    │ catcode │ catdesc  │
├────────────┼─────────┼──────────┤
│ references │ R       │ reserved │
└────────────┴─────────┴──────────┘
(1 row)

如果要将其用作标识符,则必须加倍引用它:

SELECT * FROM "references";

但最好完全避免使用这些标识符。

答案 1 :(得分:0)

使用模式名称进行前缀也很有帮助。例如:

label == last_label