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_specificationwhererole_specificationcan 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 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 的扩展。