CREATE SCHEMA — 定义新架构
CREATE SCHEMAschema_name
[ AUTHORIZATIONrole_specification
] [schema_element
[ ... ] ] CREATE SCHEMA AUTHORIZATIONrole_specification
[schema_element
[ ... ] ] CREATE SCHEMA IF NOT EXISTSschema_name
[ AUTHORIZATIONrole_specification
] CREATE SCHEMA IF NOT EXISTS AUTHORIZATIONrole_specification
whererole_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 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;
创建名为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扩展。