Per aggiungere all'altra risposta, il comportamento di Postresql sulla distinzione tra maiuscole e minuscole degli identificatori (nomi di tabelle e nomi di colonne) è:
- Se il nome non è tra virgolette, viene convertito in minuscolo . Altrimenti, non viene toccato.
- In seguito, una corrispondenza con distinzione tra maiuscole e minuscole viene tentato.
Questo vale non solo per le query, ma anche per la manipolazione dello schema; in particolare:creazione tabelle.
La regola d'oro è la coerenza:
Se vuoi scrivere applicazioni portatili ti consigliamo di citare sempre un nome particolare o di non citarlo mai
Il problema pubblicato è sorto, probabilmente, perché i nomi delle tabelle e delle colonne sono stati citati al momento della creazione (quindi non sono stati convertiti in minuscolo). Quindi, ora devono essere citati (e case-sensitive) in tutte le query.
Normalmente, tutto funziona come previsto.
db=# create table Xxx (id integer); -- unquoted, will be converted to lowercase
CREATE TABLE
db=# select * from xXx; -- this works ok
id
----
(0 rows)
db=# create table "Xxxx" (id integer); -- will be left untouched
CREATE TABLE
db=# select * from xxxx; -- bad
ERROR: relation "xxxx" does not exist
LINE 1: select * from xxxx;
db=# select * from Xxxx; -- bad
ERROR: relation "xxxx" does not exist
LINE 1: select * from Xxxx;
^
db=# select * from "Xxxx"; -- ok
id
----
(0 rows)
db=# \dt *xx*
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | Xxxx | table | postgres
public | xxx | table | postgres