1.5 约束

约束是加在表上的一种强制性的规则,是保证数据完整性的一种重要手段。当向表中插入数据,或修改表中的数据时,必须满足约束所规定的条件。例如,员工的性别必须是“男”或“女”,部门号只能是已经存在的部门的编号等。在设计表的结构时,应该充分考虑在表上需要施加的约束。

保证数据完整性的方法大致有三种,即应用程序代码、触发器和约束。其中约束是一种更为灵活的方式,它不仅维护更加方便,而且性能也比较高,是保证数据完整性的最佳选择。

约束可以在创建表时指定,也可以在表创建之后再指定。如果在表创建之后再指定约束,可能会因为表中已经存在一些数据不满足这个条件而使得约束无法施加。

1.5.1 约束的类型

在表上可以施加以下五种约束:

·NOT NULL 非空约束

·UNIQUE 唯一性约束

·PRIMARY KEY 主键约束

·FOREIFN KEY 外键约束

·CHECK 检查约束

NOT NULL约束规定一个列上的值不能为空。当使用INSERT语句向表中插入一行数据,或者使用UPDATE语句修改一行数据时,必须为该列指定值,不能使其为空。例如,在表dept中,在列deptno上施加了NOT NULL约束,其余各列都没有,所以在向这个表中插入数据时,必须为这个列指定数据。向这个表中插入数据的最简INSERT语句为:


SQL>INSERT INTO dept(deptno)VALUES(70);


UNIQUE约束规定一个列上的数据必须唯一,不能有重复值,但是允许为空值。例如在表dept中,可以在部门名称dname列上施加UNIQUE约束,这样可以保证部门的名称不会重复。当在某个列上指定了UNIQUE约束时,在该列上将自动生成一个唯一性索引。

PRIMARY KEY约束是主键约束。主键用来唯一地标识表中的一行数据,它规定在主键列上的数据不能重复,并且不能为空。每个设计合理的表都应该有一个主键。主键可以是一个列,也可以是多个列的组合。如果在某个列上指定了主键约束,那么就不需要在该列上再指定NOT NULL约束和UNIQUE约束了。

在一个表上只能创建一个主键。当创建主键时,在主键列上将自动建立一个唯一性索引,索引的名字与约束的名字相同。

FOREIFN KEY为外键约束。外键用来与另一个表建立关联关系。两个表之间的关联关系是通过主键和外键来维持的。外键规定该列中的数据必须是另一个与之关联的表中的主键列中的数据。外键可以是一个列,也可以是多个列的组合。在一个表中只能有一个主键,但是可以有多个外键。例如,在表dept中deptno列是主键列,在表emp中,empno列是主键列,deptno列是外键列,这个外键规定deptno列的数据必须是表dept中deptno列中的数据。假设要往表emp中插入一行数据,其中deptno列的值为100,而在表dept的deptno列中根本就不存在这样的数据,所以这行数据就违反了外键约束。

检查约束是一个关系表达式,它规定了一个列必须满足的条件。例如员工的性别只能是“男”或“女”,员工的工资必须在1000~8000等。当向表中插入一行,或者修改某一行时,都要检查指定列的值是否满足这个条件,如果满足,这个操作才能成功执行。