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