Является ли имя ключевым словом в PostgreSQL?
Я использую Ubuntu и PostgreSql 8.4.9.
Теперь, для любой таблицы в моей базе данных, если я делаю select table_name.name from table_name
, она показывает результат объединенных столбцов для каждой строки, хотя в таблице нет столбца name
. Для таблиц с названием столбца нет проблем. Любая идея почему?
Мои результаты таковы:
select taggings.name from taggings limit 3;
---------------------------------------------------------------
(1,4,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55")
(2,5,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55")
(3,6,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55")
(3 rows)
select name from taggings limit 3;
ERROR: column "name" does not exist
LINE 1: select name from taggings limit 3;
Ответы
Ответ 1
Это известная запутанная "функция" с небольшим количеством истории. В частности, вы можете ссылаться на кортежи из таблицы в целом с именем таблицы, а затем добавление .name
будет вызывать функцию name
на них (т.е. Будет интерпретироваться как select name(t) from t
).
В какой-то момент разработки PostgreSQL 9 Istr это немного почистилось. Вы все равно можете сделать select t from t
явно, чтобы получить эффект "строки-как-кортежи", но вы не можете применить функцию таким же образом. Итак, на PostgreSQL 8.4.9, это:
create table t(id serial primary key, value text not null);
insert into t(value) values('foo');
select t.name from t;
производит странное:
name
---------
(1,foo)
(1 row)
но на 9.1.1 выдает:
ERROR: column t.name does not exist
LINE 1: select t.name from t;
^
как и следовало ожидать.
Итак, чтобы конкретно ответить на ваш вопрос: name
является стандартным типом в PostgreSQL (используется в каталоге для имен таблиц и т.д.), а также некоторые стандартные функции для преобразования объектов в тип name
. Это фактически не зарезервировано, просто объекты, которые существуют, называемые так, плюс некоторый исторический странный синтаксис, сделали вещи запутанными; и это было исправлено разработчиками в последних версиях.
Ответ 2
Согласно документации PostgreSQL, name
является "незарезервированным" ключевым словом в PostgreSQL, SQL: 2003, SQL: 1999, или SQL-92.
SQL различает зарезервированные и незарезервированные ключевые слова. Согласно стандарту, зарезервированные ключевые слова являются единственными реальными ключевыми словами; они никогда не разрешены как идентификаторы. Незарезервированные ключевые слова имеют особое значение в конкретных контекстах и могут использоваться как идентификаторы в других контекстах. Большинство незакрытых ключевых слов на самом деле являются именами встроенных таблиц и функций, заданных SQL. Концепция незадержанных ключевых слов существует, по существу, только для того, чтобы объявить, что в некоторых контекстах какое-то предопределенное значение приложено к слову.
Предлагаемое исправление при использовании ключевых слов:
Как правило, если вы получаете ложные ошибки парсера для команд, которые содержат любое из перечисленных ключевых слов в качестве идентификатора, вы должны попытаться указать идентификатор, чтобы увидеть, не исчезла ли проблема.