一个数据库蕴含多个模式(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 SCHEMApostgres=# set search_path = public, myschema;SETpostgres=# show search_path; search_path------------------ public, myschema(1 row)