一个数据库蕴含多个模式(schema),而一个模式能够蕴含多种命名对象,比方表,数据类型,函数,操作符等。同一个对象名字能够用在不同的模式中而不产生抵触。比方 schema1 中能够蕴含表 test,schema2 中也能够同时蕴含名字为 test 的表。从这个意义上,模式很像一个命名空间(namespace)。
当创立一个对象时,默认被搁置在 public 模式中。上面是零碎默认创立的 schema。
template1=# \dn
List of schemas
Name | Owner
--------------------+----------
hawq_toolkit | ChangLei
information_schema | ChangLei
pg_aoseg | ChangLei
pg_bitmapindex | ChangLei
pg_catalog | ChangLei
pg_toast | ChangLei
public | ChangLei
(7 rows)
通常在这样几个场景下,用户须要应用模式:
● 容许多个用户同时应用一个数据库,而不产生名字抵触。
● 把数据库对象组织成多个 schema,如同是多个命名空间一样
● 第三方利用能够把它们的对象放到一个独自的 schema 中,而不和其余对象产生从图。
留神:schema 不能够嵌套,也就是说,schema 中不能够再蕴含 schema。
上面是创立 schema 的例子。
create schema myschema;
创立或者存取一个 schema 中的对象,能够应用 {schema}.{object} 模式,例如:
create table myschema.test(i int);
select * from myschema.test;
删除一个空的 schema,能够应用:
drop schema myschame;
删除不空的 schema,能够应用 cascade 关键词:
drop schema myschema cascade;
应用 {schema}.{object} 模式,通常用起来不是很不便。能够通过设置 schema 搜寻门路来简化。”SHOW search_path”命令能够给出以后的 schema 搜寻门路。”SET search_path TO schema-name1, schema-name2”能够设置 schema 搜寻门路。例如:
postgres=# show search_path;
search_path
----------------
"$user",public
(1 row)
postgres=# create schema myschema;
CREATE SCHEMA
postgres=# set search_path = public, myschema;
SET
postgres=# show search_path;
search_path
------------------
public, myschema
(1 row)