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


134

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

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

Ответы:


211

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

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

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

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


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";

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.