Подтвердить что ты не робот

Является ли имя ключевым словом в 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;
4b9b3361

Ответ 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. Концепция незадержанных ключевых слов существует, по существу, только для того, чтобы объявить, что в некоторых контекстах какое-то предопределенное значение приложено к слову.

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

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