我们在做数据库设计的时候,往往为了保证数据库的数据完整性,会有一些在数据库层面上定义的约束。这些约束有检查约束、非空约束、唯一约束、主键约束、外键约束等。在这些约束里面,前面的几个都非常容易理解,也易于使用;但是对于外键约束,理解起来并不难,但是使用好了,确是不容易。
下面简要回顾一下上述几个约束的相关知识。
检查约束:
也就是说在定义字段的时候,定义一个取值范围,当发生insert或者update的时候,数据库自动检查数值是否在合时的范围之内。例如:
CRATE TABLE student(
id serial,
name varchar(10),
scrore integer CHECK (scrore > 0)
);
非空约束
非空约束就是定义一个字段不能存在空值,常用Not Null定义。如果仅仅是非空约束,那么是数据是允许重复的。
唯一约束
唯一约束,使用UNIQUE修饰。表示该字段内的数据,是相对唯一的,即在本表内是唯一的。唯一约束的数据,可以存在NULL值。
主键约束
主键约束其实就是非空约束和主键约束的并集。主键的取值方法可以有多种,可以有自然数递增序列,也可以使用唯一编码算法产生的字符串序列。
外键约束
外键约束是很常用的一个数据约束方式。但是使用起来并不是那么简单。定义外键约束的方法,使用FOREIGN KEY,可以用于单列或者多列。FOREIGN KEY和REFERNCES经常联合使用。References表示该列引用哪个表的哪个列作为外键。单列时,FOREIGN KEY可以省略。
例如:job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs(job_id)
上述定义也可以写为:
job_id smallint NOT NULL DEFAULT 1 FOREIGN KEY (job_id) REFERENCES jobs(job_id)
说明外键job_id引用了jobs表的job_id字段作为外键。
外键约束带来的一个问题是,当用户试图删除或者更新外键所指向的键时,另外一个表中的数据,该如何处理的问题。这涉及到一个级联更新和级联删除的问题。
那么在数据库规范中,同样定义了级联更新和级联删除的相关方法。
Create table和Alter Table的References子句支持On Delete 和On update字句。如果没有指定,默认为NO Action,即:on delete no action,和on update no action,在发生删除或者更新操作的时候,回滚事务,不执行相关操作。
Cascade子句则允许操作,方法为:on delete casecade 和on update cascade 。
如果定义的时候要求能更新不能删除,则写为:
CREATE TABLE score(
id integer
references student
ON UPDATE CASCADE
ON DELETE CASCADE,
class_id varchar(5)
references class
ON UPDATE CASCADE
);
CASCADE和NO Action的结合使用,才能让外键约束充分发挥作用,不导致系统数据约束造成的混乱。