支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不再支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

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 TRIGGERGRANT 被接受为 CREATE 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

提交更正

如果您发现文档中的任何内容不正确,与您使用特定功能的经验不符或需要进一步澄清,请使用此表单报告文档问题。