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

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

IF NOT EXISTS

如果已存在同名的模式,则不做任何事情(只是发出一个提示)。使用此选项时不能包含 schema_element 子命令。

注记

要创建模式,调用用户必须对当前数据库拥有 CREATE 特权。(当然,超级用户可以绕过这一检查。)

示例

Create a schema:

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 标准允许 DEFAULT CHARACTER SET 子句出现在 CREATE SCHEMA 中,还允许比 PostgreSQL 目前接受的更多种类的子命令。

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

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

IF NOT EXISTS 选项是 PostgreSQL 的扩展。

另请参阅

ALTER SCHEMA, DROP SCHEMA