Почему запрос PostgreSQL SELECT возвращает разные результаты, если указано имя схемы?

У меня есть таблица базы данных PostgreSQL с 4 столбцами, помеченными как column_a, column_b и т. д. Я хочу запросить эту таблицу с помощью простого запроса на выборку:

select * from table_name;

Я получаю несколько результатов, похожих на:

column_a | column_b
---------+---------
'a value'|'b_value'

Но когда я использую этот запрос:

select * from schema_name.table_name;

Я получаю полный результат:

column_a | column_b | column_c | column_d
---------+----------+----------+---------
'a value'|'b value' |'c value' |'d_value' 

Столбцы c и d были добавлены позже, после создания первоначальной таблицы. Мой вопрос: почему база данных будет игнорировать более поздние столбцы, если имя схемы не включено в запрос выбора?


person Eric Jankowski    schedule 11.05.2015    source источник
comment
Вы уверены, что у вас нет двух таблиц (или представлений) с одинаковым именем в разных схемах?   -  person IMSoP    schedule 12.05.2015


Ответы (1)


Имена таблиц не уникальны в базе данных в Postgres. В разных схемах может быть любое количество таблиц с именем table_name, включая временную схему, которая всегда идет первой, если только вы явно не укажете ее после других схем в search_path. Очевидно, что существует несколько таблиц с именем table_name. Вы должны понимать роль search_path, чтобы правильно интерпретировать это:

Первая таблица живет в схеме, которая предшествует schema_name в вашей search_path (или schema_name там вообще не указана). Таким образом, неполное имя таблицы разрешается в эту таблицу (или представление). Проверьте список таблиц с именем table_name, к которым ваша текущая роль имеет доступ в вашей базе данных:

SELECT *
FROM   information_schema.tables 
WHERE  table_name = 'table_name';

Представления — это просто специальные таблицы с прикрепленным RULE внутри. Они могут играть ту же роль, что и обычная таблица, и включены в приведенный выше запрос. Подробности:

person Erwin Brandstetter    schedule 12.05.2015
comment
Это привело меня к обнаружению того, что несколько таблиц с повторяющимися именами были непреднамеренно помещены в общедоступную схему. Спасибо. - person Eric Jankowski; 12.05.2015