Экранирование имен столбцов, похожих на ключевые слова, в Postgres

134

Если столбец в таблице Постгреса имеет имя year, как должен выглядеть INSERTзапрос, чтобы установить значение для этого столбца?

Например: INSERT INTO table (id, name, year) VALUES ( ... );дает ошибку около года слова.

shybovycha
источник

Ответы:

211

Просто заключите его yearв двойные кавычки, чтобы он не интерпретировался как ключевое слово :

INSERT INTO table (id, name, "year") VALUES ( ... );

Из документации :

Есть второй вид идентификаторов: идентификатор с разделителями или идентификатор в кавычках. Он формируется путем заключения произвольной последовательности символов в двойные кавычки ("). Идентификатор с разделителями всегда является идентификатором, а не ключевым словом. Таким образом," select "может использоваться для ссылки на столбец или таблицу с именем" select ", тогда как выборка без кавычек будет восприниматься как ключевое слово и, следовательно, вызовет ошибку синтаксического анализа при использовании там, где ожидается имя таблицы или столбца.

NPE
источник
44
Некоторое предупреждение: без кавычек PostgreSQL переводит все идентификаторы в нижний регистр. MyTable, myTableи mytableтакие же. С кавычками такое сворачивание не производится. Так что "MyTable"уже не то же самое, что mytable.
AH
19
Еще лучше воздержитесь от использования зарезервированных слов или смешанного регистра в качестве идентификаторов, и вам никогда не придется использовать двойные кавычки или получать странные сообщения об ошибках.
Эрвин Брандштеттер,
8
@ErwinBrandstetter Проблема возникает, когда вы работаете над уже созданным проектом.
ceruleus
5
@ HoàngLong, да, это так. update "user" set "password" = 'value...';отлично работает ...
Phill
0

Если вы не указываете кавычки в каких-либо полях / столбцах, по умолчанию Postgres будет использовать их в нижнем регистре. И Postgres пропустит проверку ключевого слова, когда дело доходит до имени столбца.

В вашем случае я не считаю обязательным добавлять кавычки, когда дело касается файла columns. Но если вы используете keywords(зарегистрировано Postgres) в качестве имени Table, Schema, Functionили и Triggerт.д., вы должны использовать либо двойные кавычки, или вы можете указать имя схемы с точкой конкатенации.

Предположим, что заказ - это ключевое слово, зарегистрированное Postgres. А в некоторых сценариях вам необходимо использовать это ключевое слово в качестве имени таблицы.

В то время Postgres позволит вам создать таблицу с помощью keywords. В этом вся прелесть Postgres.

Чтобы получить доступ к таблице заказов, вы должны либо использовать двойные кавычки, либо вы можете указать имя схемы перед именем таблицы.

НАПРИМЕР

1.

select * from schema_name.order;

2.

select * from "order";

Точно так же вы можете использовать этот тип комбинации. Надеюсь, что это поможет вам.

Mayur
источник