Aby dodać do drugiej odpowiedzi, zachowanie Postresql dotyczące rozróżniania wielkości liter w identyfikatorach (nazwy tabel i nazwy kolumn) to:
- Jeśli nazwa nie jest cytowana, jest konwertowana na małe litery . W przeciwnym razie pozostaje nietknięty.
- Następnie dopasowanie uwzględniające wielkość liter jest próba.
Dotyczy to nie tylko zapytań, ale także manipulacji schematem; w szczególności:tworzenie tabel.
Złotą zasadą jest spójność:
Jeśli chcesz pisać aplikacje przenośne, radzimy zawsze cytować konkretną nazwę lub nigdy jej nie cytować
Zamieszczony problem pojawił się prawdopodobnie dlatego, że nazwy tabel i kolumn były cytowane w czasie tworzenia (stąd nie zostały zamienione na małe litery). Dlatego teraz muszą być cytowane (z uwzględnieniem wielkości liter) we wszystkich zapytaniach.
Zwykle wszystko działa zgodnie z oczekiwaniami.
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