# 创建模式

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

# 描述

创建模式将新模式输入到当前数据库中。模式名称必须不同于当前数据库中任何现有模式的名称。

模式本质上是一个命名空间:它包含命名对象(表、数据类型、函数和运算符),其名称可以与其他模式中存在的其他对象的名称重复。命名对象可以通过使用模式名称作为前缀“限定”它们的名称来访问,或者通过设置包含所需模式的搜索路径来访问。一种创建指定非限定对象名称的命令在当前模式中创建对象(搜索路径前面的那个,可以用函数确定current_schema)。

可选地,创建模式可以包含在新模式中创建对象的子命令。子命令的处理与创建模式后发出的单独命令基本相同,除了如果授权使用子句时,所有创建的对象都将归该用户所有。

# 参数

模式名称

要创建的模式的名称。如果省略,则*用户名*用作模式名称。名字不能以pg_,因为这样的名称是为系统模式保留的。

用户名

将拥有新架构的用户的角色名称。如果省略,则默认为执行命令的用户。要创建另一个角色拥有的模式,您必须是该角色的直接或间接成员,或者是超级用户。

架构元素

定义要在模式中创建的对象的 SQL 语句。目前,只有创建表,创建视图,创建索引,创建序列,创建触发器授予被接受为内的条款创建模式.创建模式后,可以在单独的命令中创建其他类型的对象。

如果不存在

如果同名的模式已经存在,则什么也不做(发出通知除外)。*架构元素*使用此选项时不能包含子命令。

# 笔记

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

# 例子

创建架构:

CREATE SCHEMA myschema;

为用户创建架构;架构也将被命名

CREATE SCHEMA AUTHORIZATION 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 标准允许一个默认字符集条款创建模式,以及比 PostgreSQL 目前接受的更多的子命令类型。

SQL 标准指定子命令在创建模式可以以任何顺序出现。当前的 PostgreSQL 实现并不能处理子命令中的所有前向引用情况;有时可能需要重新排序子命令以避免前向引用。

根据 SQL 标准,模式的所有者始终拥有其中的所有对象。PostgreSQL 允许模式包含由模式所有者以外的用户拥有的对象。仅当架构所有者授予创建将其架构的特权授予其他人,或者超级用户选择在其中创建对象。

如果不存在选项是 PostgreSQL 扩展。

# 也可以看看

改变模式,删除模式