CREATE SCHEMA

Name

CREATE SCHEMA -- 定义一个新模式

Synopsis

CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ]

描述

CREATE SCHEMA在当前数据库里输入一个新模式。该模式名将在当前数据库里现存的所有模式名中唯一。

模式实际上是一个名字空间:它包含命名对象(表、数据类型、函数、操作符)这些名字可以和其它模式里存在的其它对象重名。 命名对象要么是通过用模式名作为前缀"修饰"进行访问,要么是通过设置一个搜索路径包含所需要的模式。 一条带着无修饰对象名的CREATE命令都是在当前模式中创建的(在搜索路径最前面的模式;可以用current_schema函数来判断)。

可选的,CREATE SCHEMA可包含在新模式内创建对象的子命令。 该子命令基本上与创建模式之后发布的独立命令相同对待,除了使用 AUTHORIZATION的情况。所有创建的对象将由该用户拥有 另外,CREATE SCHEMA可以包括在新模式中创建对象的子命令。 这些子命令和那些在创建完模式后发出的命令没有任何区别, 只不过是如果使用了AUTHORIZATION子句,那么所有创建的对象都将被该用户拥有。

参数

schema_name

要创建的模式名字。如果省略,则使用用户名作为模式名。这个名字不能以 pg_开头,因为这样的名字保留给系统模式使用。

user_name

将拥有该模式的用户的名称。若省略,默认该用户用此命令。 只有超级用户可以创建除其本身以外的其他用户所有的模式。 将拥有该模式的用户名。如果省略,缺省为执行该命令的用户名。 只有超级用户才能创建不属于自己的模式。

schema_element

一个SQL语句,定义一个要在模式里创建的对象。目前,只有 CREATE TABLECREATE VIEWCREATE INDEXCREATE SEQUENCECREATE TRIGGERGRANT是可以接受的子句。其它类型的对象可以在创建 完模式之后的独立命令里创建。

注意

要创建模式,调用该命令的用户必需在当前数据库上有CREATE权限。 当然,超级用户可以绕开这个检查。

例子

创建一个模式:

CREATE SCHEMA myschema;

为用户joe创建模式; 模式名也叫joe:

CREATE SCHEMA 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 了自己的模式的 权限给了其他人才可能出现。

又见

ALTER SCHEMA, DROP SCHEMA