百科 / SQL 命令 / 数据库、模式与表空间
SQL COMMAND · 数据库、模式与表空间
CREATE SCHEMA
定义一个新模式
define a new schema
CREATE数据库、模式与表空间引入 7.3现存至 20 devel4 次语法变更
- 动词
CREATE- 对象
SCHEMA- 引入版本
- 7.3
- 状态
- 现存
- 语法变更次数
- 4
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 无变化。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
CREATE SCHEMA · 语法 2
CREATE SCHEMA · 语法 3
CREATE SCHEMA · 语法 4
role_specification
语法概要
CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ] CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ] CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ] CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification 其中 role_specification 可以是: 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;
创建一个被用户 joe 拥有的名为 test 的模式,除非已经有一个名为 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 扩展。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 19← 18正文更新
正文更新PostgreSQL 16← 15正文更新
正文更新PostgreSQL 14← 13语法变化
+ | CURRENT_ROLE+ | CURRENT_USERPostgreSQL 10← 9.6正文更新
正文更新PostgreSQL 9.6← 9.5正文更新
正文更新PostgreSQL 9.5← 9.4语法变化
+ CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]+ CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]+ CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]+ CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification+ | CURRENT_USER+ | SESSION_USER− CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [ schema_element [ ... ] ]− CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ]− CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION user_name ]PostgreSQL 9.3← 9.2语法变化
+ CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION user_name ]+ CREATE SCHEMA IF NOT EXISTS AUTHORIZATION user_name正文更新PostgreSQL 9.0← 8.4语法变化
+ CREATE SCHEMA schema_name [ AUTHORIZATION user_name ] [ schema_element [ ... ] ]+ CREATE SCHEMA AUTHORIZATION user_name [ schema_element [ ... ] ]− CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ]− CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]正文更新PostgreSQL 8.3← 8.2正文更新
正文更新PostgreSQL 8.0← 7.4正文更新
正文更新PostgreSQL 7.4← 7.3正文更新
正文更新PostgreSQL 7.3← 7.2新增此命令
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
CREATE DATABASE | CREATE | DATABASE | 1713 次 | |
| 创建一个新数据库 | 现存 | |||
ALTER DATABASE | ALTER | DATABASE | 159 次 | |
| 更改一个数据库 | 现存 | |||
DROP DATABASE | DROP | DATABASE | 132 次 | |
| 移除一个数据库 | 现存 | |||
CREATE SCHEMA | CREATE | SCHEMA | 144 次 | |
| 定义一个新模式 | 现存 | |||
ALTER SCHEMA | ALTER | SCHEMA | 144 次 | |
| 更改一个模式的定义 | 现存 | |||
DROP SCHEMA | DROP | SCHEMA | 8.21 次 | |
| 移除一个模式 | 现存 | |||
CREATE TABLESPACE | CREATE | TABLESPACE | 144 次 | |
| 定义一个新表空间 | 现存 | |||
ALTER TABLESPACE | ALTER | TABLESPACE | 143 次 | |
| 更改一个表空间的定义 | 现存 | |||
DROP TABLESPACE | DROP | TABLESPACE | 9.23 次 | |
| 移除一个表空间 | 现存 | |||