PosegreSQL基础回顾(第 5 章 数据定义)
来源:http://www.postgres.cn/docs/11/5.1.?表基础?SQL并不保证表中行的顺序。当一个表被读取时,表中的行将以非特定顺序出现,除非明确地指定需要排序。?
?尝试移除一个不存在的表会引起错误。然而,在SQL脚本中在创建每个表之前无条件地尝试移除它的做法是很常见的,即使发生错误也会忽略之,因此这样的脚本可以在表存在和不存在时都工作得很好(如果你喜欢,可以使用 5.3.1.?检查约束一个检查约束是最普通的约束类型。它允许我们指定一个特定列中的值必须要满足一个布尔表达式。例如,为了要求正值的产品价格,我们可以使用:? CREATE TABLE products (
product_no integer,name text,price numeric CHECK (price > 0)
);
?更多 5.3.2.?非空约束一个非空约束总是被写成一个列约束。一个非空约束等价于创建一个检查约束 ? CREATE TABLE products (
product_no integer NULL,name text NULL,price numeric NULL
);
然后可以在需要的地方插入 5.3.3.?唯一约束唯一约束保证在一列中或者一组列中保存的数据在表中所有行间是唯一的。 通常,如果表中有超过一行在约束所包括列上的值相同,将会违反唯一约束。但是在这种比较中,两个空值被认为是不同的。 这意味着即便存在一个唯一约束,也可以存储多个在至少一个被约束列中包含空值的行。 这种行为符合SQL标准,但我们听说一些其他SQL数据库可能不遵循这个规则。所以在开发需要可移植的应用时应注意这一点。 5.3.4.?主键一个主键约束表示可以用作表中行的唯一标识符的一个列或者一组列。这要求那些值都是唯一的并且非空。 一个表最多只能有一个主键(可以有任意数量的唯一和非空约束,它们可以达到和主键几乎一样的功能,但只能有一个被标识为主键)。 关系数据库理论要求每一个表都要有一个主键。但PostgreSQL中并未强制要求这一点,但是最好能够遵循它。 5.3.5.?外键一个外键约束指定一列(或一组列)中的值必须匹配出现在另一个表中某些行的值。我们说这维持了两个关联表之间的引用完整性。? 我们知道外键不允许创建与任何产品都不相关的订单。但如果一个产品在一个引用它的订单创建之后被移除会发生什么?SQL允许我们处理这种情况。直观上,我们有几种选项:
为了说明这些,让我们在上面的多对多关系例子中实现下面的策略:当某人希望移除一个仍然被一个订单引用(通过 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)
);?
限制删除或者级联删除是两种最常见的选项。
还有其他两种选项: 与 正常情况下,如果一个引用行的任意一个引用列都为空,则它不需要满足外键约束。如果在外键定义中加入了 一个外键所引用的列必须是一个主键或者被唯一约束所限制。这意味着被引用列总是拥有一个索引(位于主键或唯一约束之下的索引),因此在其上进行的一个引用行是否匹配的检查将会很高效。由于从被引用表中 更多关于更新和删除数据的信息请见第?6?章。外键约束的语法描述请参考CREATE TABLE。 5.3.6.?排他约束排他约束保证如果将任何两行的指定列或表达式使用指定操作符进行比较,至少其中一个操作符比较将会返回否或空值。语法是: CREATE TABLE circles ( c circle,EXCLUDE USING gist (c WITH &&) );? 详见 增加一个排他约束将在约束声明所指定的类型上自动创建索引。? 5.8.?模式一个数据库包含一个或多个命名模式,模式中包含着表。模式还包含其他类型的命名对象,包括数据类型、函数和操作符。相同的对象名称可以被用于不同的模式中二不会出现冲突,例如 下面是一些使用方案的原因:
模式类似于操作系统层的目录,但是模式不能嵌套。? 5.8.2.?公共模式在前面的小节中,我们创建的表都没有指定任何模式名称。默认情况下这些表(以及其他对象)会自动的被放入一个名为“public”的模式中。 任何新数据库都包含这样一个模式。因此,下面的命令是等效的: CREATE TABLE products ( ... ); 以及: CREATE TABLE public.products ( ... );?
5.9.?继承?PostgreSQL实现了表继承,这对数据库设计者来说是一种有用的工具(SQL:1999及其后的版本定义了一种类型继承特性,但和这里介绍的继承有很大的不同)。 更多 5.10.?表分区划分指的是将逻辑上的一个大表分成一些小的物理上的片。 更多? 5.13.?依赖跟踪当我们创建一个涉及到很多具有外键约束、视图、触发器、函数等的表的复杂数据库结构时,我们隐式地创建了一张对象之间的依赖关系网。例如,具有一个外键约束的表依赖于它所引用的表。 为了保证整个数据库结构的完整性,PostgreSQL确保我们无法删除仍然被其他对象依赖的对象。 ?PostgreSQL中的几乎所有 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |