Postgres 数据库由一个或多个模式(schema)组成,模式可以看成是一个表的集合,一个模式可以包含视图、索引、数据类型、函数和操作符等。
相同的对象名称可以出现在不同的模式中,而且不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。
Postgres数据库支持跨模式查询,也就是说连接到schmea1的会话可以查询myschema模式下的表。
使用模式可以允许多个用户使用相同的数据库而不会相互打扰,第三方应用的对象可以放在独立的模式中,不会与其他对象的名称发生冲突。
下面看一下在数据库中模式的基本操作:
创建一个新的模式myschema:
postgres=# create schema myschema;
CREATE SCHEMA
postgres=# \dn
List of schemas
Name | Owner
----------+----------
myschema | postgres
public | postgres
schema01 | dbuser
(3 rows)
在myschema模式下创建新表:
postgres=# create table myschema.user_info(user_id int);
CREATE TABLE
postgres=# \dt myschema.*
List of relations
Schema | Name | Type | Owner
----------+-----------+-------+----------
myschema | user_info | table | postgres
(1 row)
删除myschema模式(模式下存在对象如表、函数时,需要使用cascade级联删除):
postgres=# drop schema myschema cascade;
NOTICE: drop cascades to table myschema.user_info
DROP SCHEMA
postgres=# \dn
List of schemas
Name | Owner
----------+----------
public | postgres
schema01 | dbuser
(2 rows)
Postgres数据库的search_path类似于linux中的path环境变量,它显示了当前用户可以查询的schema列表,也就决定了用户可以访问哪些模式下的对象。一般来说,所有查询调用都是基于搜索路径的。
postgres 数据库中用户默认的 search_path 包含了$user、public、pg_catalog。
- $user:postgres优先查询与当前用户名匹配的模式。
- public:公共模式,postgres数据库默认创建的schema,任何用户都可以访问。
- pg_catalog:系统Schema,包含了系统自带的函数、表、系统视图、数据类型转换器以及数据类型定义等元数据。
当然,用户也可以自己定义search_path,从而决定可以访问哪些模式下面的对象。
下面看一下如何查看和修改search_path:
postgres=# show search_path;
search_path
-----------------
"$user", public
(1 row)
postgres=# set search_path = "$user",public,schema01;
SET
postgres=# show search_path;
search_path
---------------------------
"$user", public, schema01
(1 row)
注意,这里只是修改了当前用户在本会话中的search_path,退出会话后修改失效。如果想永久性更改用户的search_path,需要使用alter user命令。
postgres=# show search_path;
search_path
-----------------
"$user", public
(1 row)
postgres=# alter user postgres set search_path = "$user",public,schema01;
ALTER ROLE
postgres=# \q
postgres@SZX5APLN622241:~$ psql
psql (12.18 (Ubuntu 12.18-0ubuntu0.20.04.1), server 11.7)
Type "help" for help.
postgres=# show search_path;
search_path
---------------------------
"$user", public, schema01
(1 row)