SCHEMA
SCHEMA(模式)就是数据库对象的集合。所谓的数据库对象也就是常说的表、索引、视图和存储过程等。相同的对象名称可以在不同的模式中使用而不会发生冲突。与数据库不同,模式不是严格分开的:用户可以通过指定数据库,访问他所连接的数据库中任何模式中的对象。模式具有“增删改查”四种操作。
CREATE SCHEMA
任何用户拥有父数据库的CREATE权限,即可执行创建新模式的操作。创建成功后,root用户拥有该模式的全部权限:CREATE,DROP,USAGE权限。当创建用户不是root用户时,则除root角色外,该用户也同样拥有该模式的全部权限。
每条CREATE SCHEMA创建一个模式。在数据库创建的同时,已经默认为数据库创建了一个“public”模式,且将其USAGE权限赋给public角色,使所有用户均可访问public模式。与其他模式相同,public模式也可被删除并创建,但被重新创建的public模式并不会再将其USAGE权限赋给public角色。
创建模式存在两种情况,第一种情况是用户同数据库操作,即在当前数据库下直接创建模式;第二种情况是用户跨数据库操作,即使用户当前处于数据库“a”中,仍可通过指定数据库在数据库“b”中创建模式。
语法格式
创建SCHEMA的语法格式如下:
如果添加了IF NOT EXISTS,当要创建的模式不存在时,创建模式;如果已经存在,创建模式不成功,但是不抛出错误。
如果不添加IF NOT EXISTS,当要创建的模式不存在时,创建模式;如果已经存在,创建模式不成功,抛出错误:模式已存在。
参数说明
schema_name
新建模式名称。可以是schema_name或者database_name.schema_name。如果只有schema_name,在当前数据库创建名称为schema_name的SCHEMA;如果跨库创建SCHEMA,需要指定数据库名称,使用database_name.schema_name。
示例
示例1:当前数据库创建名称为s1的SCHEMA。
CREATE SCHEMA s1;
CREATE SCHEMA
示例2:在当前数据库创建已经存在的名称为s1的SCHEMA,创建不成功但不抛出错误。
CREATE SCHEMA IF NOT EXISTS s1;
CREATE SCHEMA
示例3:跨数据库在数据库db1中创建名称为s1的SCHEMA。
CREATE SCHEMA db1.s1;
CREATE SCHEMA
示例4:创建SCHEMA s1并在其下面创建表和视图(当前SCHEMA不是s1时)。
本示例主要展示的是可通过SCHEMA名+“.”+对象名(表,视图等)的方式对SCHEMA下面的对象进行访问以及相关操作。
注意:进入到特定的SCHEMA下面,使用以下方式:
SET search_path= schema_name.
CREATE SCHEMA s1;
CREATE SCHEMA
SHOW search_path;
search_path
+——————-+
public
CREATE TABLE s1.t1 (id INT,address TEXT);
CREATE TABLE
show tables;
table_name
+——————+
(0 rows)
SHOW CREATE TABLE t1;
pq: relation “t1” does not exist
SHOW CREATE TABLE s1.t1;
table_name | create_statement
+——————+—————————————————————-+
s1.t1 | CREATE TABLE t1 ( | id INT NULL, | address TEXT NULL, | FAMILY “primary” (id, address, rowid) | )
(1 row)
SET search_path=s1;
SET
SHOW TABLES;
table_name
+——————+
t1 (1 row)
SHOW CREATE TABLE t1;
table_name | create_statement
+————————+—————————————-+
t1 | CREATE TABLE t1 ( | id INT NULL, | address TEXT NULL, | FAMILY “primary” (id, address, rowid) | )
SHOW CREATE TABLE s1.t1;
table_name | create_statement
+——————+—————————————————————-+
s1.t1 | CREATE TABLE t1 ( | id INT NULL, | address TEXT NULL, | FAMILY “primary” (id, address, rowid) | )
示例5:创建SCHEMA s2并在其下面创建表和视图(进入到SCHEMA s2中)。
CREATE SCHEMA s2;
CREATE SCHEMA
SET search_path=s2;
SET > CREATE TABLE t1 (id INT,address TEXT);
CREATE TABLE
SHOW CREATE TABLE s2.t1;
table_name | create_statement
+——————+—————————————————————-+
s2.t1 | CREATE TABLE t1 ( | id INT NULL, | address TEXT NULL, | FAMILY “primary” (id, address, rowid)
示例6:不同模式下可以存在同名表。
SHOW CREATE TABLE s2.t1;
table_name | create_statement
+——————+—————————————————————-+
s2.t1 | CREATE TABLE t1 ( | id INT NULL, | address TEXT NULL, | FAMILY “primary” (id, address, rowid) | )
SHOW CREATE TABLE s1.t1;
table_name | create_statement
+——————+—————————————————————-+
s1.t1 | CREATE TABLE t1 ( | id INT NULL, | address TEXT NULL, | FAMILY “primary” (id, address, rowid) | )
(1 row) |
在一个数据库中,创建两个及以上同名模式是不允许的,但是可以在不同数据库中分别创建同名的模式。
在创建新的模式时,不能创建数据库原生模式(crdb_internal、information_schema和pg_catalog)和public。
使用模式可以产生以下益处:
允许多个用户使用一个数据库而不干扰其他用户。
把数据库对象组织成逻辑组,让它们便于管理。
第三方的应用可以放在不同的模式中,不会和其他对象的名字冲突。
SHOW SCHEMAS
SHOW SCHEMAS可显示目标数据库下的模式(如未指定数据库则默认为当前数据库),包括系统原生的模式、public和用户创建的模式。用户拥有目标数据库下的模式的任意权限,即可显示。
语法格式
查看SCHEMA的语法格式如下:
当存在FROM database_name时,查询指定数据库的所有SCHEMA;否则,查询当前数据库的所有SCHEMA。
参数说明
database_name
数据库名称。
示例
示例1:查看SCHEMA。
SHOW SCHEMAS;
schema_name
+————————————————-+
s1
crdb_internal
information_schema
pg_catalog
public (5 rows) |
ALTER SCHEMA
ALTER SCHEMA语句可修改模式名称,但不能修改数据库原生模式的名称,也不能修改为数据库中已存在的模式的名称。模式的重命名支持跨数据库库迁移操作,即重命名后的模式可迁移到新的数据库中。任何用户拥有模式重命名后所属数据库的CREATE权限、重命名前原模式和其下全部对象的DROP权限时,即可执行重命名目标模式的操作。修改成功后,该用户拥有该模式的全部权限:CREATE,DROP,USAGE权限,且其他用户保留对该模式和其下对象的原有权限。
语法格式
修改SCHEMA的语法格式如下:
如果添加了IF EXISTS,当要修改的SCHEMA存在时,进行修改;不存在时不会抛出错误。
如果不添加IF EXISTS,当要修改的SCHEMA存在时,进行修改;不存在时抛出错误:模式不存在。
参数说明
schema_old_name
SCHEMA当前名称。
schema_new_name
SCHEMA要修改的新名称。
示例
示例1:将名称为s1的SCHEMA修改为s2。
SHOW SCHEMAS;
schema_name
+————————————————-+
s1
crdb_internal
information_schema
pg_catalog
public
ALTER SCHEMA s1 RENAME TO s2;
ALTER SCHEMA
SHOW SCHEMAS;
schema_name
+————————————————-+
s2
crdb_internal
information_schema
pg_catalog
public
DROP SCHEMA
任何用户拥有目标模式和其下全部对象的DROP权限,即可执行删除目标模式的操作。删除成功后,所有用户针对目标模式和其下全部对象的所有权限均被删除。当要删除的模式下存在表(table)时,需要级联(CASCADE)删除,否则不能删除。
语法格式
删除SCHEMA的语法格式如下:
如果存在IF EXISTS,当删除的模式存在时才进行删除操作。模式不存在,不抛出错误。
如果不存在IF EXISTS,当删除的模式存在时才进行删除操作。模式不存在,抛出错误:模式不存在。
RESTRICT:默认参数,有约束删除。如果删除的模式中包含数据库对象,则删除失败。需要删除该模式下的所有数据库对象后才能删除该模式。
CASCADE:级联删除。在删除模式时将该模式下所有数据库对象一起删除。
参数说明
name_list
预删除模式名称列表。可同时删除多个模式,当删除多个模式时,模式间以“,”隔开。
示例
示例1:删除模式s2。
SHOW SCHEMAS;
schema_name
+————————————————-+
s2
crdb_internal
information_schema
pg_catalog
public
DROP SCHEMA s2 CASCADE;
DROP SCHEMA
SHOW SCHEMAS;
schema_name
+————————————————-+
crdb_internal
information_schema
pg_catalog
public
示例2:删除不存在的模式s2。添加IF EXISTS,删除错误但是不报错。
DROP SCHEMA IF EXISTS s2 CASCADE;
DROP SCHEMA