Чувствительность к регистру Postgres

Я импортировал 100 таблиц в Postgres из сервера MSSql 2008 через инструмент, который создал все таблицы вместе со своими столбцами в заглавной букве. Теперь, если я хочу сделать представление данных из таблицы, например, - STD_TYPE_CODES as -

select * from STD_TYPE_CODES

Я получаю следующую ошибку -

ERROR:  relation "std_type_codes" does not exist
LINE 1: select * from STD_TYPE_CODES
                  ^
********** Error **********
ERROR: relation "std_type_codes" does not exist
SQL state: 42P01
Character: 15

Я знаю, что могу помещать кавычки вокруг имени таблицы как -

select * from "STD_TYPE_CODES"

Но поскольку я работал с MSSql Server, такой проблемы нет. Так есть ли способ избавиться от этого? Пожалуйста, помогите.

Ответы

Ответ 1

В PostgreSQL имена без кавычек нечувствительны к регистру. Таким образом, SELECT * FROM hello и SELECT * FROM HELLO эквивалентны.

Однако в цитируемых именах учитывается регистр. SELECT * FROM "hello" не эквивалентен SELECT * FROM "HELLO".

Чтобы создать "мост" между именами в кавычках и именами без кавычек, имена без HeLLo неявно заключаются в нижний регистр, поэтому hello, HELLO и HeLLo эквивалентны "hello", но не "HELLO" или "HeLLo" (OOPS!).

Таким образом, при создании сущностей (таблиц, представлений, процедур и т.д.) В PostgreSQL вы должны указывать их без кавычек или в кавычках, но в нижнем регистре.


Для преобразования существующих таблиц/представлений/и т.д. вы можете использовать что-то вроде ALTER TABLE "FOO" RENAME TO "foo".

Или попробуйте изменить дамп из MSSQL, чтобы сделать его "PostgreSQL-совместимым" (чтобы он содержал foo или "foo" но не "FOO").

  • Либо путем явного редактирования файла дампа. (Если вы используете Linux, вы можете сделать sed -r 's/"[^"]+"/\L\0/g' dumpfile - однако sed -r 's/"[^"]+"/\L\0/g' dumpfile что эта команда также может изменять текст в строковых литералах.)
  • Или указав некоторые параметры при получении дампа из MSSQL. (Я не уверен, есть ли такие опции в MSSQL, никогда не использовал их, но, вероятно, такие опции должны существовать.)

Ответ 2

Приведенное выше решение также работает для pg_dump на Debian Stretch. В конце концов выяснилось, что это похоже на то, как вы это делаете внутри командной строки psql:

pg_dump -d myDatabaseName -t \"myTableName\" > myDumped.sql

Он не будет работать с одинарными кавычками после обратной косой черты, подобно тому, как он не будет работать в приглашении psql>.