Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

CREATE SCHEMA

CREATE SCHEMA — 定义一个新模式

语法

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

where role_specification can be:

    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 TABLECREATE VIEWCREATE INDEXCREATE SEQUENCECREATE TRIGGERGRANTCREATE SCHEMA 内的子句接受。创建模式后,可以在单独的命令中创建其他类型的对象。

IF NOT EXISTS

如果已存在同名模式,则不执行任何操作(除了发出通知)。如果使用此选项,则无法包含 schema_element 子命令。

注意

要创建模式,调用用户必须具有当前数据库的 CREATE 权限。(当然,超级用户绕过此检查。)

示例

创建模式

CREATE SCHEMA myschema;

为用户 joe 创建模式;该模式也将命名为 joe(其他内容略)

CREATE SCHEMA AUTHORIZATION joe;

创建名为 test 的模式,该模式归用户 joe 所有,除非已存在名为 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 标准指定 CREATE SCHEMA 中的子命令可以按任何顺序出现。目前的 PostgreSQL 实现并不处理子命令中前向引用的所有情况;有时可能需要重新排序子命令以避免出现前向引用。

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

IF NOT EXISTS 选项是 PostgreSQL 扩展。

另请参见

ALTER SCHEMADROP SCHEMA