# 创建模式
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 扩展。