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 的扩展。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或需要进一步澄清,请使用此表单来报告文档问题。