现在的位置: 首页 > 综合 > 正文

数据库设计的外键约束问题

2013年08月21日 ⁄ 综合 ⁄ 共 1360字 ⁄ 字号 评论关闭

我们在做数据库设计的时候,往往为了保证数据库的数据完整性,会有一些在数据库层面上定义的约束。这些约束有检查约束、非空约束、唯一约束、主键约束、外键约束等。在这些约束里面,前面的几个都非常容易理解,也易于使用;但是对于外键约束,理解起来并不难,但是使用好了,确是不容易。

下面简要回顾一下上述几个约束的相关知识。

 

检查约束:

也就是说在定义字段的时候,定义一个取值范围,当发生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的结合使用,才能让外键约束充分发挥作用,不导致系统数据约束造成的混乱。 

抱歉!评论已关闭.