CREATE SCHEMA

Name

CREATE SCHEMA  --  定义一个新的模式

Synopsis

CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]
  

输入

schemaname

要创建的模式名字.如果省略,则使用用户名作为模式名.

username

将拥有该模式的用户名.如果省略,缺省为执行该命令的用户名. 只有超级用户才能创建不属于自己的模式.

schema_element

一个 SQL 语句,定义一个要在模式里创建的对象. 目前,只有 CREATE TABLECREATE VIEW, 和 GRANT 是在 CREATE SCHEMA 里面可以接受的 子句.其它类型的对象可以在创建完模式之后的独立的命令里创建.

输出

CREATE SCHEMA

如果命令成功,返回这条消息.

ERROR: namespace "schemaname" already exists

如果声明的模式已经存在.

描述

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

模式实际上是一个名字空间∶它包含命名对象(表,数据类型,函数和操作符) 这些名字可以和其它模式里存在的其它对象重名.命名对象要么是通过 用模式名作为前缀"修饰"这些它们的名字进行访问,要么是通过设置一个 搜索路径包含所需要的模式.

另外,CREATE SCHEMA 可以包括在新模式中 创建对象的子命令.这些子命令和那些在创建完模式后发出的命令没有 任何区别,只不过是如果使用了 AUTHORIZATION 子句, 那么所有创建的对象都将被该用户拥有.

注意

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

使用 DROP SCHEMA 删除一个模式.

例子

创建一个模式∶

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;
  

兼容性

SQL92

SQL92 允许在 CREATE SCHEMA 里面有一个 DEFAULT CHARACTER SET 子句,以及比目前 PostgreSQL 可以接受的更多的子命令.

SQL92 声明在 CREATE SCHEMA 里的子命令可以以 任意顺序出现.目前 PostgreSQL 里的实现还不能处理所有子命令里需要提前引用的情况;有时候可能需要 重排一下子命令的顺序以避免提前引用.

在 SQL92 里,模式的所有者总是拥有其中的所有对象. PostgreSQL 允许模式包含非模式所有者所有 的对象.只有在模式所有者 CREATE 了自己的模式的权限给 了其它人才可能出现.