Имя - это специальное ключевое слово в PostgreSQL? - PullRequest
14 голосов
/ 07 декабря 2011

Я использую 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;

Ответы [ 2 ]

21 голосов
/ 07 декабря 2011

Это известная запутанная «особенность» с небольшой историей. В частности, вы можете сослаться на кортежи из таблицы в целом с именем таблицы, а затем добавление .name вызовет для них функцию name (то есть она будет интерпретирована как select name(t) from t).

В какой-то момент разработки PostgreSQL 9 Istr это немного исправило. Вы все еще можете сделать select t from t явно, чтобы получить эффект row-as-tuples, но вы не можете применить функцию таким же образом. Итак, на 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. Это на самом деле не зарезервировано, просто объекты, которые называются так, плюс какой-то странный синтаксис, приводят в замешательство; и это было исправлено разработчиками в последних версиях.

3 голосов
/ 07 декабря 2011

Согласно документации PostgreSQL , name является "незарезервированным" ключевым словом в PostgreSQL, SQL: 2003, SQL: 1999 или SQL-92.

SQL различает зарезервированные и незарезервированные ключевые слова.Согласно стандарту, зарезервированные ключевые слова являются единственными реальными ключевыми словами;они никогда не допускаются в качестве идентификаторов.Незарезервированные ключевые слова имеют особое значение только в определенных контекстах и ​​могут использоваться в качестве идентификаторов в других контекстах.Большинство незарезервированных ключевых слов на самом деле являются именами встроенных таблиц и функций, определенных SQL.Концепция незарезервированных ключевых слов по существу существует только для того, чтобы объявить, что к определенному контексту приписывается некоторое предопределенное значение.

Рекомендуемое исправление при использовании ключевых слов:

Как правило, если вы получаете ложные ошибки синтаксического анализатора для команд, которые содержат любое из перечисленных ключевых слов в качестве идентификатора, вы должны попытаться заключить в кавычки идентификатор, чтобы увидеть, исчезнет ли проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...