浅谈PostgreSQL 模式(SCHEMA)

一、概念介绍

PostgreSQL的 模式 (SCHEMA) 是一个非常重要且强大的概念,它本质上是数据库内部的命名空间目录,用于组织和管理数据库对象(如表、视图、函数、索引等)。

PostgreSQL 的模式是一个强大的逻辑隔离和组织工具。它超越了简单的"数据库用户"概念,提供了更精细的命名空间管理。正确使用模式可以让你的数据库结构更清晰、更安全、更易于维护,也是实现中型多租户应用的理想选择。

默认模式: 每个数据库创建时都会自动生成一个名为 public 的模式。如果未指定模式,对象默认创建在此处。

相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。

使用模式的优势:

  • 允许多个用户使用一个数据库并且不会互相干扰。

  • 将数据库对象组织成逻辑组以便更容易管理。

  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

二、创建模式

2.1语法

我们可以使用 CREATE SCHEMA语句来创建模式,语法格式如下:

sql 复制代码
CREATE SCHEMA myschema (
...
);

上述语句将创建一个名为 myschema 的模式。

模式通常用于组织和隔离数据库对象,防止对象名称冲突。

创建表(Table)使用 CREATE TABLE 语句:

sql 复制代码
CREATE TABLE myschema.mytable (
    column1 datatype1,
    column2 datatype2,
    ...
);

上述语句将在 myschema 模式下创建一个名为 mytable 的表,并定义了一系列的列及其数据类型。

请注意,上述的 datatype1, datatype2 等应该被替换为实际的数据类型,例如 integer, varchar(255), 等等。

2.2使用 psql 命令行工具

sql 复制代码
-- 连接到数据库
psql -U username -d database_name

-- 创建 schema
CREATE SCHEMA schema_name;

-- 创建 schema 并指定所有者
CREATE SCHEMA schema_name AUTHORIZATION owner_name;

-- 如果不存在则创建
CREATE SCHEMA IF NOT EXISTS schema_name;

2.3使用 pgAdmin 图形界面

sql 复制代码
连接到数据库

右键点击 "Schemas" → "Create" → "Schema"

填写 schema 名称和所有者

点击 "Save"

2.4创建带有权限控制的 schema

sql 复制代码
-- 创建 schema
CREATE SCHEMA myschema;

-- 授权给用户
GRANT USAGE ON SCHEMA myschema TO username;

-- 授予所有权限
GRANT ALL ON SCHEMA myschema TO username;

-- 允许用户在该 schema 中创建对象
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema 
GRANT ALL ON TABLES TO username;

三、删除模式

删除一个为空的模式(其中的所有对象已经被删除):

sql 复制代码
DROP SCHEMA myschema;

删除一个模式以及其中包含的所有对象:

sql 复制代码
DROP SCHEMA myschema CASCADE;

四、修改模式

sql 复制代码
-- 修改 schema 名称
ALTER SCHEMA old_name RENAME TO new_name;

-- 修改 schema 所有者
ALTER SCHEMA schema_name OWNER TO new_owner;

五、查询模式

sql 复制代码
-- 查看所有 schema
\dn

-- 查看 schema 详细信息
\dn+

五、注意事项

  • PostgreSQL 默认有一个 public schema
  • 每个数据库可以有多个 schema
  • 不同 schema 中的对象名可以相同
  • 使用 search_path 来控制对象查找顺序
  • 生产环境中建议为不同应用或模块使用不同的 schema 进行隔离

参考文件:https://www.runoob.com/postgresql/postgresql-schema.html

相关推荐
Goat恶霸詹姆斯1 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七2 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草2 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程2 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu0802 小时前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
讯方洋哥2 小时前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
惊讶的猫3 小时前
Redis持久化介绍
数据库·redis·缓存
Apple_羊先森3 小时前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle
全栈前端老曹4 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
神梦流4 小时前
ops-math 算子库的扩展能力:高精度与复数运算的硬件映射策略
服务器·数据库