受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
此文档适用于不受支持的 PostgreSQL 版本。
您可能需要查看当前版本的相同页面,或上面列出的其他受支持版本。

CREATE SCHEMA

CREATE SCHEMA — 定义一个新模式

Synopsis

CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification

其中 role_specification 可以是:

    user_name
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

描述

CREATE SCHEMA在当前数据库中创建一个新模式。 该模式名必须与当前数据库中任何现有模式的名称不同。

模式本质上是一个命名空间:它包含具名对象(表、数据类型、函数和操作符), 这些对象的名称可以与其他模式中的对象重名。访问具名对象时,可以在其名称前加上 模式名作为前缀来限定名称,或者设置一个包含所需模式的搜索路径。 指定非限定对象名的CREATE命令会在当前模式中创建该对象 (即搜索路径最前面的模式,可通过函数current_schema确定)。

CREATE SCHEMA还可以选择包含子命令,以便在新模式中创建 对象。这些子命令基本上会被当作在创建模式之后单独发出的命令来处理。不过,如果 使用了AUTHORIZATION子句,则所有创建的对象都将归该用户所有。

参数

schema_name #

要创建的模式名称。如果省略, user_name将被用作模式名。 该名称不能以pg_开头,因为这类名称保留给系统模式。

user_name #

将拥有新模式的用户的角色名。如果省略,则默认为执行该命令的用户。要创建 由另一个角色拥有的模式,你必须能够对该角色执行 SET ROLE

schema_element #

定义要在该模式中创建的对象的 SQL 语句。当前,只有 CREATE AGGREGATECREATE COLLATIONCREATE DOMAINCREATE FUNCTIONCREATE INDEXCREATE OPERATORCREATE PROCEDURECREATE SEQUENCECREATE TABLECREATE TEXT SEARCH CONFIGURATIONCREATE TEXT SEARCH DICTIONARYCREATE TEXT SEARCH PARSERCREATE TEXT SEARCH TEMPLATECREATE TRIGGERCREATE TYPECREATE VIEWGRANT 可作为CREATE SCHEMA中的子句使用。其他类型的对象可以在模式 创建之后通过单独的命令创建。

IF NOT EXISTS #

如果同名模式已经存在,则不执行任何操作(但会发出一条提示)。 使用该选项时不能包含 schema_element子命令。

注解

要创建一个模式,执行该命令的用户必须拥有当前数据库的CREATE 权限(当然,超级用户可以绕过这项检查)。

schema_element子命令(如果有的话) 会按编写顺序执行。例外是CREATE TABLE子命令中的外键约束子 句会被延后,并在最后追加。这允许形成循环的外键引用,这有时很有用。

示例

创建一个模式:

CREATE SCHEMA myschema;

为用户joe创建一个模式,该模式也将被命名为 joe

CREATE SCHEMA AUTHORIZATION joe;

创建一个被用户joe拥有的名为test的模式, 除非已经有一个名为test的模式(不管joe 是否拥有那个预先存在的模式)。

CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;

创建一个模式并且在其中创建一个表和视图:

CREATE SCHEMA hollywood
    CREATE TABLE films (title text, release date, awards text[])
    CREATE VIEW winners AS
        SELECT title, release FROM films WHERE awards IS NOT NULL;

请注意,各个子命令末尾都不带分号。

下面是实现相同结果的一种等效写法:

CREATE SCHEMA hollywood;
CREATE TABLE hollywood.films (title text, release date, awards text[]);
CREATE VIEW hollywood.winners AS
    SELECT title, release FROM hollywood.films WHERE awards IS NOT NULL;

兼容性

SQL 标准允许在CREATE SCHEMA中使用 DEFAULT CHARACTER SET子句,并允许使用比 PostgreSQL当前所接受的更多子命令类型。

其他一些 SQL 实现会尝试允许更多种类的前向引用,不仅限于外键约束,还包括对在后续 schema_element 子命令中定义对象的引用。 但从总体上看,要正确实现这一点是困难甚至不可能的,而且除了外键之外,SQL 标准是否要求这种行为也并不明确。

根据 SQL 标准,模式的拥有者总是拥有其中的所有对象。 PostgreSQL允许模式包含由模式拥有者之外的用户 所拥有的对象。只有当模式拥有者把其模式上的CREATE权限 授予其他人,或者超级用户选择在该模式中创建对象时,才会发生这种情况。

IF NOT EXISTS选项是一种 PostgreSQL扩展。