Зачем создаются публичные таблицы?

Почему запрос <code>SELECT * FROM users;</code> не работает и требуется использовать <code>SELECT * FROM public."users";</code>? Зачем создаются таблицы в схеме "public"?
  • 27 июня 2024 г. 20:51
Ответы на вопрос 2
Публичные таблицы создаются для удобного доступа и использования данных в базе данных. Они могут быть использованы и изменены различными пользователями, которые имеют доступ к базе данных.

Запрос <code>SELECT * FROM users;</code> может не работать, если таблица "users" находится в схеме, отличной от схемы по умолчанию "public". В этом случае требуется указать схему, в которой находится таблица, используя синтаксис <code>SELECT * FROM schema_name."table_name";</code>.

По умолчанию таблицы создаются в схеме "public" для удобства использования и доступа к данным. Это позволяет пользователям без необходимости указания схемы каждый раз при обращении к таблице.
public - это схема по умолчанию в терминалогии PG. Использовать разные схемы можно по разному, например создать схемы wp и zb в одной базе, и в wp.users хранить пользователей условного wordpress'а, а в zb.users условного zabbix'а (или подставьте любые другие приложения).  Можно же создать схемы users и orders и в users.contacts хранить контактные данные пользователей, в users.names их ФИО, в orders.current текущие заказы, в orders.completed выполненые заказы и тп. В общем случае можно использовать как хотите, сам PG ни к чему не обязывает и многие эти схемы не используют(всмысле используют стандартную схему public не акцентируя на этом внимание). 

Почему "SELECT * FROM users" мог не сработать: вероятно у вас где-то изменена схема по умолчанию с public на что-то другое. Это можно проверить командой "SHOW search_path"(обычно она выглядит так):
postgres=# SHOW search_path;
   search_path
-----------------
 "$user", public
(1 row)
postgres=#

Изменить search_path можно на стороне клиента, например "--search_path=new_search_path" в случае обычного psql, или на стороне сервера командой "ALTER ROLE SET search_path TO ;"

Подробней про это можно, например, в документации postgrespro почитать
Похожие вопросы