Oracle表的约束(主键约束,外键约束,唯一性约束,检查约束,默认值约束,非空约束)

表的约束

约束的根本目的是保证数据的完整性,主要有主键约束、外键约束、唯一性约束、检查约束、默认值约束、非空约束。

域完整性
是对数据表中的字段属性进行约束,包括字段的值域、字段的类型以及字段的有效规则等约束,域完整性主要包括not null约束,唯一性约束,检查约束。
实体完整性
即指关系中的主属性值不能为null,不能重复。实体完整性是对关系中的记录唯一性,也就是主键的约束。
参照完整性
指关系中的外键必须是另一个关系的主键的有效值,或指对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。

主键约束

主键约束可以保证数据完整性,通过将主键纳入查询条件可达到查询结果最多返回一条记录的目的。
添加主键约束语法结构

Alter table 表名 add constraints 约束名 primary key(列名1,列名2,...)

其中约束名可以省略,可以自动产生。主键约束在每个数据表中只有一个,可以有多个列组成。

修改主键约束

  1. 禁用/启用主键约束
alter table 表名 enable/disable primary  key
  1. 重命名主键
alter table 表名 rename constraint 原主键名称 to 新主键名称
  1. 删除主键约束
Alter table 表名 drop primary key;

外键约束

foreign key约束即外键约束,通过使用外键,保证表与表的参照完整性.定义了foreign key约束的列为“外键列”,被foreign key约束引用的列称为“引用列"。包含外键的表称为子表,也成为引用表,包含引用列的表称为父表,也称为被引用表。

添加外键约束

创建外键时,首先在主表中创建主键,因为当使用外键寻找主表中的记录时,必须要找到唯一一条,所以必须在主表中使用主键来标识记录的唯一性。
因为外键是建立在子表上的,首先查看子表customersnew的数据结构以及主表

desc customersnew;
desc employees;

将employee表作为主(父)表,把cunstomsnew表作为子表,现在为cunstomsnew表与employee表建立关联,在Oracle中提供关键字foreign key来实现外键约束的添加,语法:

Alter table 子表 add constraint 外键名 foreign key(列名)references 主表(列名) on delete cascade——[设置级联删除]

添加外键约束语法

验证外键约束

外键约束创建成功之后,当添加或修改外键列为不合格的数据时,外键约束将禁止该动作的执行。

  1. 比如主表employee中没有employee_id为001的记录,但向表中插入新的数据,account_mgr_id列的值为001,就违反了参照完整性。
  2. 对数据进行更新操作时,无论是更新主表employee中的主键列,还是从表customersnew中的外键列,都将破坏参照完整性。因此,Oracle将抛出错误提示,并禁止修改操作。造成错误的原因是,创建主键约束时,没有将约束设置为级联删除。级联删除是指,当用户删除主表中的某条数据时,Oracle会自动搜索并删除从表中的相关记录,如果要实现级联删除,需要删除表中存在的外键约束。

修改外键约束

删除外键约束与删除主键约束的语法一致,在Oracle中提供了SQL语句drop constraint实现外键约束。

Alter 表名 drop constraint 外键约束名

外键使用场景

** 严格遵循父子关系的数据表应该使用外键 **

将应用程序中的父子关系转移到外键约束,建立外键的确会将表之间的关系复杂化,但是尽量不要通过应用程序来实现本可由外键实现的完整性检查。因为应用程序实现类似约束需要考虑的情况比较多,容易出现泄露,当程序比较负责时,一旦出现错误也很难定位错误的位置和原因。而外键约束则由数据库自动处理,相应的定位和处理非常容易。

不要过分使用外键,合理使用外键可以增加整个系统的健壮性,但是不能过分使用外键,首先,使用过多的外键会增加数据库的复杂度,同时会降低设计的可读性。

foreign key约束具有如下特点:
定义foreign key约束的列中只能包含相应的在其它表中引用的列的值,或为null。

定义了foreign key约束的外键列和相应的引用列可以存在于同一表中,这种情况称为”自引用“。

对于同一个列,可以同时定义foreign key约束和not null约束

可以在单个列上定义foreign key约束,也可以在多个列的组合上定义foreign key约束。因此,foreign key约束既可以定义在列级定义,也可以在表级定义。

唯一性约束

唯一性约束(UNIQUE约束)和之前的主键约束类似,不同的是,唯一性约束在一个表上可以有多个,而主键约束在一个表上只能有一个
** 添加唯一性约束**

alter table 表名 add constraint 唯一性约束名 unique(列名)——[唯一性约束]

验证唯一性约束
在customersnew表中,数phone_number是唯一的,如果在添加一条重复的电话号码数据,Oracle会提示错误。唯一性约束列允许空值存在,可以将空值设置为null成功插入数据表。

修改唯一性约束

唯一性约束创建之后,可以对其进行删除、重命名、禁用/启用等操作。
重命名唯一性索引

altert table 表名 rename Constraint 原约束名 to 新约束名

禁用/启用唯一性约束

alter table 表名 disable/enable Constraint 约束名称

删除唯一性索引

alter table customersnew drop constraint uk_ph;

唯一性约束使用场景

唯一性约束可以建立在列或者列的组合上,可以作为主键约束的补充。
主键列为id,而id只是一个自增的整数序列,与实际的业务逻辑无关。

检查约束

添加检查约束

在创建表之后,我们会发现有些列也需要确定唯一性。这时可以引进检查约束来实现表的完整性。

Alter table表名 add constraint 检查约束名 check(条件);

验证检查约束

在成功创建检查约束之后,可以向其中插入非法数据,已验证其作用。

修改检查约束

检查约束创建之后,可以对检查约束进行重命名、删除和禁用/启用等操作。
重命名加检查约束
检查约束的重命名和其它约束的重命名具有完全相同的语法,即利用rename选项。

alter table customersnew rename constraint ch_id_city to ck_id_city

禁用/启用检查约束
检查约束的禁用和启用操作也使用disable/enable选项。
删除检查约束
删除检查约束与删除约束的语法一致,在Oracle中提供SQL语句drop constraint实现检查约束的删除,

Alter table 表名 drop constraint 检查约束名

非空约束

在创建表时经常会添加非空约束,以确保字段必须要输入值。该约束与之前介绍的其它约束不同,它是直接创建列的非空约束。
为列添加非空约束

Alter table 表名 modify 列名 not null;

撤销非空约束

Alter table 表名 modify 列名 null;

默认约束

与null值相似,在创建表时,可以通过default关键词指定列的默认值。当向带有默认值表插入记录时,如果未指定该列的值,系统会自动采用定义的默认值作为该列的值。
为列添加默认约束

Alter table 表名 modify 列名 default ,

删除默认(default)约束
删除默认值约束的方法是将该列设置为null\

alter table customernew modify status default null;

总结

本章着重讲述了Oracle中的几种主要约束:主键约束、外键约束、唯一约束、检查约束、默认值约束、非空约束。外键用于约束表之间的关系,而主键和唯一性约束则约束表中的记录;检查约束和非空约束则针对表中列的值。另外,所有约束都具有非常类似的操作,例如添加、删除、修改等。本章的重点是,在学习的过程中,对各种约束进行比较学习,这样可以更好地理解Oracle中的约束。

你可能感兴趣的:(数据库)