↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

Wiki / SQL 命令

CREATE SCHEMA

定义一个新模式

英文手册覆盖始于 PostgreSQL 6.4. 来源历史与运行验证各自保留独立版本边界。

当前阅读 PG 18·选择有来源记录的版本

anchor
SQL-CREATESCHEMA
file
sql-createschema.html
lang
en
name
CREATE SCHEMA
purpose
define a new schema
purpose zh
未知
sections same as
未知
slug
18

语法

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 schema_name AUTHORIZATION role_specification schema_element
CREATE SCHEMA · 语法 2
CREATE SCHEMA AUTHORIZATION role_specification schema_element
CREATE SCHEMA · 语法 3
CREATE SCHEMA IF NOT EXISTS schema_name AUTHORIZATION role_specification
CREATE SCHEMA · 语法 4
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification
role_specification
user_name CURRENT_ROLE CURRENT_USER SESSION_USER

版本定义 PG 18

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 TABLE、CREATE VIEW、CREATE INDEX、CREATE SEQUENCE、CREATE TRIGGER和GRANT可作为 CREATE SCHEMA中的子句使用。其他类型的对象可以在模式创建之后通过单独的命令创建。

IF NOT EXISTS

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

注解

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

示例

创建一个模式:

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 标准规定,CREATE SCHEMA中的子命令可以按任意顺序出现。当前的PostgreSQL实现并不能处理子命令中所有前向引用的情况;有时可能需要重新排列子命令的顺序,以避免前向引用。

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

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

另见

ALTER SCHEMA, DROP SCHEMA

比较版本

完整来源事实

synopsis html

CREATE SCHEMA <em class="replaceable"><code>schema_name</code></em> [ AUTHORIZATION <em class="replaceable"><code>role_specification</code></em> ] [ <em class="replaceable"><code>schema_element</code></em> [ ... ] ]
CREATE SCHEMA AUTHORIZATION <em class="replaceable"><code>role_specification</code></em> [ <em class="replaceable"><code>schema_element</code></em> [ ... ] ]
CREATE SCHEMA IF NOT EXISTS <em class="replaceable"><code>schema_name</code></em> [ AUTHORIZATION <em class="replaceable"><code>role_specification</code></em> ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION <em class="replaceable"><code>role_specification</code></em>

<span class="phrase">where <em class="replaceable"><code>role_specification</code></em> can be:</span>

    <em class="replaceable"><code>user_name</code></em>
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

synopsis text

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

来源引用

完整定义与证据 JSON

定义来源

center · PostgreSQL 18 · a709ab85

正文语言: zh-Hans · 1b5ca64c