PosegreSQL基础回顾(第 5 章 数据定义)

编程之家收集整理的这篇文章主要介绍了PosegreSQL基础回顾(第 5 章 数据定义)编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

来源:http://www.postgres.cn/docs/11/

5.1. 表基础

 sql并不保证表中行的顺序。当一个表被读取时,表中的行将以非特定顺序出现,除非明确地指定需要排序。 

 尝试移除一个不存在的表会引起错误。然而,在sql脚本中在创建每个表之前无条件地尝试移除它的做法是很常见的,即使发生错误也会忽略之,因此这样的脚本可以在表存在和不存在时都工作得很好(如果你喜欢,可以使用DROP TABLE IF EXISTS变体来防止出现错误消息,但这并非标准sql)。

5.3.1. 检查约束

一个检查约束是最普通的约束类型。它允许我们指定一个特定列中的值必须要满足一个布尔表达式。例如,为了要求正值的产品价格,我们可以使用: 

CREATE TABLE products (
    product_no integer,name text,price numeric CHECK (price > 0)
);

 更多

5.3.2. 非空约束

一个非空约束总是被写成一个列约束。一个非空约束等价于创建一个检查约束CHECK (column_name IS NOT NULL),但在Postgresql中创建一个显式的非空约束更高效。这种方式创建的非空约束的缺点是我们无法为它给予一个显式的名称

 NOT NULL约束有一个相反的情况:NULL约束。这并不意味着该列必须为空,进而肯定是无用的。相反,它仅仅选择了列可能为空的默认行为。sql标准中并不存在NULL约束,因此它不能被用于可移植的应用中(Postgresql中加入它是为了和某些其他数据库系统兼容)。但是某些用户喜欢它,因为它使得在一个脚本文件中可以很容易的进行约束切换。例如,初始时我们可以:

CREATE TABLE products (
    product_no integer NULL,name text NULL,price numeric NULL
);

然后可以在需要的地方插入NOT关键词。 

5.3.3. 唯一约束

唯一约束保证\在一列中或者一组列中保存的数据在表中所有行间是唯一的。

通常,如果表中有超过一行在约束所包括列上的值相同,将会违反唯一约束。但是在这种比较中,两个空值被认为是不同的。

这意味着即便存在一个唯一约束,也可以存储多个在至少一个被约束列中包含空值的行。

这种行为符合sql标准,但我们听说一些其他sql数据库可能不遵循这个规则。所以在开发需要可移植的应用时应注意这一点。

5.3.4. 主键

一个主键约束表示可以用作表中行的唯一标识符的一个列或者一组列。这要求那些值都是唯一的并且非空

一个表最多只能有一个主键(可以有任意数量的唯一和非空约束,它们可以达到和主键几乎一样的功能,但只能有一个被标识为主键)。

关系数据库理论要求每一个表都要有一个主键。但Postgresql中并未强制要求这一点,但是最好能够遵循它。

5.3.5. 外键

一个外键约束指定一列(或一组列)中的值必须匹配出现在另一个表中某些行的值。我们说这维持了两个关联表之间的引用完整性。 

我们知道外键不允许创建与任何产品都不相关的订单。但如果一个产品在一个引用它的订单创建之后被移除会发生什么?sql允许我们处理这种情况。直观上,我们有几种选项:

  • 不允许删除一个被引用的产品

  • 同时也删除引用产品的订单

  • 其他? 

为了说明这些,让我们在上面的多对多关系例子中实现下面的策略:当某人希望移除一个仍然被一个订单引用(通过order_items)的产品时 ,我们组织它。如果某人移除一个订单,订单项也同时被移除:

CREATE TABLE products (
    product_no integer PRIMARY KEY,price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,shipping_address text,...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,order_id integer REFERENCES orders ON DELETE CASCADE,quantity integer,PRIMARY KEY (product_no,order_id)
); 

限制删除或者级联删除是两种最常见的选项。

RESTRICT阻止删除一个被引用的行

NO ACTION表示在约束被检察时如果有任何引用行存在,则会抛出一个错误,这是我们没有指定任何东西时的默认行为(这两种选择的本质不同在于NO ACTION允许检查被推迟到事务的最后,而RESTRICT则不会)。

CASCADE指定当一个被引用行被删除后,引用它的行也应该被自动删除

还有其他两种选项:SET NULLSET DEFAULT。这些将导致在被引用行被删除后,引用行中的引用列被置为空值或它们的默认值。注意这些并不会是我们免于遵守任何约束。例如,如果一个动作指定了SET DEFAULT,但是默认值不满足外键约束,操作将会失败。

ON DELETE相似,同样有ON UPDATE可以用在一个被引用列被修改(更新)的情况,可选的动作相同。在这种情况下,CASCADE意味着被引用列的更新值应该被复制到引用行中。 

正常情况下,如果一个引用行的任意一个引用列都为空,则它不需要满足外键约束。如果在外键定义中加入了MATCH FULL,一个引用行只有在它的所有引用列为空时才不需要满足外键约束(因此空和非空值的混合肯定会导致MATCH FULL约束失败)。如果不希望引用行能够避开外键约束,将引用行声明为NOT NULL。 

一个外键所引用的列必须是一个主键或者被唯一约束所限制。这意味着被引用列总是拥有一个索引(位于主键或唯一约束之下的索引),因此在其上进行的一个引用行是否匹配的检查将会很高效。由于从被引用表中DELETE一行或者UPDATE一个被引用列将要求对引用表进行扫描以得到匹配旧值的行,在引用列上建立合适的索引也会大有益处。由于这种做法并不是必须的,而且创建索引也有很多种选择,所以外键约束的定义并不会自动在引用列上创建索引。

更多关于更新和删除数据的信息请见第 6 章。外键约束的语法描述请参考CREATE TABLE

5.3.6. 排他约束

排他约束保证如果将任何两行的指定列或表达式使用指定操作符进行比较,至少其中一个操作符比较将会返回否或空值。语法是:

CREATE TABLE circles (
    c circle,EXCLUDE USING gist (c WITH &&)
); 

详见CREATE TABLE ... CONSTRAINT ... EXCLUDE

增加一个排他约束将在约束声明所指定的类型上自动创建索引。 

5.8. 模式

一个数据库包含一个或多个命名模式,模式中包含着表。模式还包含其他类型的命名对象,包括数据类型、函数和操作符。相同的对象名称可以被用于不同的模式中二不会出现冲突,例如schema1myschema都可以包含名为mytable的表。和数据库不同,模式并不是被严格地隔离:一个用户可以访问他们所连接的数据库中的所有模式内的对象,只要他们有足够的权限。

下面是一些使用方案的原因:

  • 允许多个用户使用一个数据库并且不会互相干扰。

  • 数据库对象组织成逻辑组以便更容易管理。

  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

模式类似于操作系统层的目录,但是模式不能嵌套。 

5.8.2. 公共模式

在前面的小节中,我们创建的表都没有指定任何模式名称。默认情况下这些表(以及其他对象)会自动的被放入一个名为public”的模式中。

任何新数据库都包含这样一个模式。因此,下面的命令是等效的:

CREATE TABLE products ( ... );   以及:   CREATE TABLE public.products ( ... ); 

5.9. 继承

 Postgresql实现了表继承,这对数据库设计者来说是一种有用的工具(sql:1999及其后的版本定义了一种类型继承特性,但和这里介绍的继承有很大的不同)。

更多

5.10. 表分区

划分指的是将逻辑上的一个大表分成一些小的物理上的片。

更多 

5.13. 依赖跟踪

当我们创建一个涉及到很多具有外键约束、视图、触发器、函数等的表的复杂数据库结构时,我们隐式地创建了一张对象之间的依赖关系网。例如,具有一个外键约束的表依赖于它所引用的表。

为了保证整个数据库结构的完整性,Postgresql确保我们无法删除仍然被其他对象依赖的对象。

 Postgresql中的几乎所有DROP命令都支持CASCADE。当然,其本质的区别随着对象的类型而不同。我们也可以用RESTRICT代替CASCADE来获得默认行为,它将阻止删除任何被其他对象依赖的对象。

总结

以上是编程之家为你收集整理的PosegreSQL基础回顾(第 5 章 数据定义)全部内容,希望文章能够帮你解决PosegreSQL基础回顾(第 5 章 数据定义)所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

相关文章

猜你在找的Postgre SQL相关文章

本章介绍SQL的语法。它是理解后面章节的基础,它们详细描述了SQL如何用于定义和修改数据。对于已经熟悉SQL的用户,同样应该仔细阅读本章,因为它包含了各个SQL数据库中实现方式不同的一些规则和概念,这些是PostgreSQL特有的属性。4.1. 词法结构SQL输入由一系列命令组成。命令由一系列符号组成,以分号(“;”)结束。输入流的结束也会结束一个命令。每个命令能够使用的符号不尽相同。
3.1. 引言上一章我们描述了PostgreSQL中使用SQL存储和访问数据的基本概念。接下来我们将会讨论一些简化管理和防止数据丢失或损坏的高级特性。最后,我们将会了解一些PostgreSQL扩展。本章将会引用第2章中的一些示例,并且进行修改和改进,所以最好先阅读第2章。本章的某些示例也可以在tutorial目录中的advanced.sql中找到。该文件中还包含一些示例数据。3.2.
上一章讨论了如何创建存储数据的表和其他结构。接下来就需要往表中填充数据。本章设计如何插入,更新,以及删除表中的数据。下一章将最后说明如何从数据库中查询久违的数据。6.1. 插入数据 表刚被创建时,没有任何数据。数据库能够使用之前的第一件事就是插入数据。从概念上讲,每次插入一行数据。当然你也可以插入多行数据,但是无法插入少于一行的数据。即使你只知道某些字段值,也必须创建一个完整的行。I...
2.1. 引言本章概述了如何使用SQL执行简单的操作。本教程只是关于SQL的一个简介,而不是完整的教程。关于SQL的书籍有很多,包括Understanding the New SQL和A Guide to the SQL Standard。需要注意的是一些PostgreSQL语言特性是针对标准SQL的扩展。在以下示例中,假设你已经创建了一个名为mydb的数据库,参见前文,并且能够登录p
1.1. 安装要使用,先安装!可能你的环境中已经安装了PostgreSQL,也许是操作系统已经包含了PostgreSQL,也许是系统管理员已经安装了PostgreSQL。如果是这样的话,你应该通过操作系统文档或者系统管理员了解如何访问PostgreSQL。如果你不确定是否已经安装了PostgreSQL或者是否能够用于实验,可以自己安装。安装并不难,而且是一个很好的练习。PostgreSQL可以
PostgreSQL 11 增加了一个新的模式对象:存储过程(Stored Procedure)。存储过程和函数(Function)类似,不过它没有返回值。存储过程最大的优势就是能够支持事务控制,也就是可以在定义中使用 COMMIT 或者 ROLLBACK 语句。使用 CREATEALTERDROP PROCEDURE 命令创建修改删除存储过程,使用 CALL 命令调用存储过程。支持存储...
文章目录Barman 简介Barman 简介Barman(Backup and Recovery Manager,备份与恢复管理器)是一个用于 PostgreSQL 数据库灾难恢复的开源管理工具,使用 Python 编写。Barman 使得企业能够执行多个关键业务数据库的远程备份,并且协助 DBA 执行灾难时的数据恢复。Barman 用于 PostgreSQL 数据库的物理备份,与 Ora...
pgAdmin 是一个非常流行、功能强大并且开源的 PostgreSQL 管理与开发平台。pgAdmin 支持 Linux、Unix、Mac OS X 以及 Windows 操作系统,可以管理 PostgreSQL 9.2 以及更高版本。