模式(Schema)
PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含多个具有相同名称的对象,只要它们位于不同的模式中就不会冲突。
创建模式
创建模式使用CREATE SCHEMA
命令。例如:
sql
CREATE SCHEMA myschema;
这将创建一个名为myschema
的新模式。
默认模式
PostgreSQL为每个新数据库自动创建一个名为public
的模式。如果在创建对象时没有指定模式名称,PostgreSQL会将对象放置在此public
模式中。
模式搜索路径
在实际应用中,通常会使用不带模式名称的非限定名来引用表,例如staff
表而不是完全限定名sales.staff
表。当使用名称引用表时,PostgreSQL会使用模式搜索路径来查找表,这是一系列模式的列表。PostgreSQL将访问搜索路径中的第一个匹配的表。如果没有找到匹配项,即使数据库中的其他模式中存在具有相同名称的表,也会返回错误。
模式和权限
默认情况下,用户无法访问他们不拥有的模式中的任何对象。要允许这样做,模式的所有者必须在模式上授予USAGE
权限。默认情况下,每个人对public
模式都有该权限。
模式的用途
使用模式的原因包括:
- 允许多个用户使用一个数据库而不会相互干扰。
- 将数据库对象组织成逻辑组,使它们更易于管理。
- 第三方应用程序可以放入单独的模式中,因此它们不会与其他对象的名称冲突。
注意事项
- 模式类似于操作系统级别的目录,但模式不能嵌套。
- 在SQL标准中,模式内的对象被不同用户拥有的概念是不存在的。此外,一些实现不允许创建与所有者名称不同的模式名称。实际上,在只实现标准中指定的基本模式支持的数据库系统中,模式和用户的概念几乎等同。
- 默认情况下,如果用户没有指定模式名称,创建对象时会使用当前模式(search path中的第一个模式)。如果在
CREATE TABLE
命令中没有指定模式名称,新表将被创建在当前模式中。
示例
创建模式:
sql
CREATE SCHEMA ecommerce;
删除模式:
sql
DROP SCHEMA ecommerce;
或者级联删除模式及其所有引用对象:
sql
DROP SCHEMA ecommerce CASCADE;
在模式中创建表:
sql
CREATE TABLE ecommerce.customers (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
这些是PostgreSQL模式的基本概念和操作。
模式和数据库中的表有什么区别?
在 PostgreSQL 中,模式(Schema)和表(Table)是两个不同的概念,它们在数据库结构中扮演着不同的角色:
-
模式(Schema):
- 模式是一个命名空间,它包含了一组数据库对象,如表、视图、索引、数据类型、函数和操作符。
- 模式用于逻辑上组织数据库对象,使得具有相同名称的不同对象可以共存于不同的模式中,从而避免了命名冲突。
- 模式可以看作是数据库中的一个容器或一个目录,它们包含的对象对于数据库用户来说是透明的。
- 模式可以提高数据库的组织性,使得管理和访问控制更加方便。
- PostgreSQL 默认提供了一个名为
public
的模式,用户也可以创建自己的模式。
-
表(Table):
- 表是数据库中存储数据的实际结构,是关系型数据库的基本构建块。
- 表由行(rows)和列(columns)组成,每一列可以有一个数据类型,每一行代表一个数据记录。
- 表总是属于某个模式,并且每个模式可以包含多个表。
- 表是实际存储数据的地方,用户可以通过 SQL 语句对表中的数据进行查询、插入、更新和删除等操作。
区别:
- 逻辑层次:模式是逻辑上的分组,而表是物理上存储数据的结构。
- 命名空间:模式提供了一个命名空间,可以包含同名的表,这些表在不同的模式中不会冲突。
- 组织结构:模式用于组织和分类数据库对象,而表则是这些对象中的一种,用于存储具体的数据。
- 权限管理:模式可以有自己的权限设置,可以控制用户对模式内对象的访问,而表的权限通常是通过模式来继承的。
例如,你可以在一个名为 ecommerce
的模式中创建一个名为 customers
的表,这个表就属于 ecommerce
模式。如果你不指定模式,那么创建的表将默认放在 public
模式中。