PGSQL PUBLIC Schema?
分类: 编码创建于: 6/2/2025
在 PostgreSQL 中,public
并不是一种“模式”或表的属性,而是数据库中的一个默认 schema(模式) 的名称。让我详细解释一下这个概念及其在数据库管理软件中的显示。
什么是 public
schema?
- 在 PostgreSQL 中,
schema
是一种逻辑分组机制,用于组织数据库中的对象(如表、视图、函数等)。你可以把 schema 想象成一个命名空间,用来避免对象名称冲突,并对权限进行更细粒度的控制。 public
是 PostgreSQL 数据库中默认创建的一个 schema。任何新创建的表、视图等,如果在创建时没有显式指定 schema,都会默认放在public
schema 中。- 换句话说,
public
是一个“容器”,你的表被放在这个容器里。当你在数据库管理软件(如 pgAdmin、DBeaver 等)中看到某张表显示为public.<table_name>
,表示这张表属于public
schema。
为什么会有 public
schema?
public
schema 的存在是为了方便用户快速开始使用数据库,而不需要手动创建和管理 schema。- 默认情况下,新创建的用户对
public
schema 具有USAGE
权限,并且可以创建对象(除非管理员修改了权限设置)。 - 在小型项目或个人使用中,通常直接使用
public
schema 就足够了。但在大规模项目中,可能会创建多个 schema 来分离不同的模块或团队的数据。
在数据库管理软件中看到 public
的含义
- 当你使用数据库管理软件时,看到某张表显示为
public.<table_name>
(例如public.users
),这只是告诉你该表位于public
schema 中。 - 如果你在创建表时没有指定 schema,例如:
则该表会默认创建在1CREATE TABLE users ( 2 id BIGSERIAL PRIMARY KEY, 3 username VARCHAR(50) NOT NULL 4);
public
schema 中,等同于:1CREATE TABLE public.users ( 2 id BIGSERIAL PRIMARY KEY, 3 username VARCHAR(50) NOT NULL 4);
如何确认表所在的 schema?
你可以通过以下 SQL 查询确认某张表所在的 schema:
1SELECT table_schema, table_name 2FROM information_schema.tables 3WHERE table_name = 'your_table_name';
这会返回该表的 table_schema
列,如果显示为 public
,则表在 public
schema 中。
是否需要使用其他 schema?
- 如果你的项目规模较小,使用
public
schema 没有任何问题。 - 如果项目复杂,或者需要分离不同模块的数据和权限,可以创建自定义 schema,例如:
1CREATE SCHEMA my_app; 2CREATE TABLE my_app.users ( 3 id BIGSERIAL PRIMARY KEY, 4 username VARCHAR(50) NOT NULL 5);
- 你还可以通过设置搜索路径(search path)来简化查询,避免每次都指定 schema:
这样,数据库会优先在1SET search_path TO my_app, public;
my_app
schema 中查找对象,如果找不到再去public
schema。
权限相关注意事项
- 默认情况下,
public
schema 对所有用户开放(具有USAGE
权限),并且新用户可以在其中创建对象。如果你的项目对安全性要求较高,可以通过以下命令撤销这些默认权限:1REVOKE CREATE ON SCHEMA public FROM PUBLIC; 2REVOKE USAGE ON SCHEMA public FROM PUBLIC;
- 然后,根据需要为特定用户或角色分配权限。
总结
在 PostgreSQL 中,public
是一个默认的 schema,用于存放未指定 schema 的表和对象。当你在数据库管理软件中看到某张表标记为 public
,这只是表示该表位于默认的 public
schema 中,而非某种特殊模式或属性。如果你不需要复杂的 schema 管理,继续使用 public
是完全可以的;如果需要更高的组织性和安全性,可以考虑创建自定义 schema。
如果你有其他关于 schema 或 PostgreSQL 管理的问题,或者有具体场景需要进一步解释,请随时告诉我!