模式
模式#
一个数据库包含多个模式(schema),而一个模式可以包含多种命名对象,比如表,数据类型,函数,操作符等。同一个对象名字可以用在不同的模式中而不产生冲突。比如 schema1 中可以包含表 test,schema2 中也可以同时包含名字为 test 的表。从这个意义上,模式很像一个命名空间(namespace)。
当创建一个对象时,默认被放置在 public 模式中。下面是系统默认创建的 schema。
1template1=# \dn
2 List of schemas
3 Name | Owner
4--------------------+----------
5 hawq_toolkit | oushu
6 information_schema | oushu
7 pg_aoseg | oushu
8 pg_bitmapindex | oushu
9 pg_catalog | oushu
10 pg_toast | oushu
11 public | oushu
12(7 rows)
通常在这样几个场景下,用户需要使用模式:
允许多个用户同时使用一个数据库,而不产生名字冲突。
把数据库对象组织成多个 schema,好像是多个命名空间一样
第三方应用可以把它们的对象放到一个单独的 schema 中,而不和其他对象产生冲突。
注意:schema 不可以嵌套,也就是说,schema 中不可以再包含 schema。
下面是创建 schema 的例子。
1create schema myschema;
创建或者存取一个 schema 中的对象,可以使用 {schema}.{object} 形式,例如:
1create table myschema.test(i int);
2select * from myschema.test;
删除一个空的 schema,可以使用:
1drop schema myschame;
删除不空的 schema,可以使用 cascade 关键词:
1drop schema myschema cascade;
使用 {schema}.{object} 形式,通常用起来不是很方便。可以通过设置 schema 搜索路径来简化。”SHOW search_path” 命令可以给出当前的 schema 搜索路径。”SET search_path TO schema-name1, schema-name2” 可以设置 schema 搜索路径。例如:
1postgres=# show search_path;
2 search_path
3----------------
4 "$user",public
5(1 row)
6
7postgres=# create schema myschema;
8CREATE SCHEMA
9
10postgres=# set search_path = public, myschema;
11SET
12
13postgres=# show search_path;
14 search_path
15------------------
16 public, myschema
17(1 row)