一、数据库的完整性约束定义



数据库的完整性约束是为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。数据库的完整性约束包括:



1) 实体完整性:规定表的每一行在表中是惟一的实体。 



2) 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。 



3) 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。 



4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。



二、常用的完整性约束



1、主键约束:



主键约束就是对一个列进行了约束,约束为非空且唯一。



以下是代码   要对一个列加主键,列名为id,表名为emp



格式为:



alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)



例子:



alter table emp add constraint ppp primary key (id)



2、check约束:



比方说,年龄列的数据都要大于20的



表名(emp) 列名(age)



格式:



alter table 表名称 add constraint 约束名称 增加的约束类型 (列名)



例子:



alter table emp add constraint xxx check(age>20)



3、unique约束:



这样的约束就是给列的数据追加的不重复的约束类型



格式:



alter table 表名 add constraint 约束名称 约束类型(列名)



比方说可以给ename列加个unique,让ename列的数据不重复



例子:



alter table emp add constraint qwe unique(ename)



4、默认约束:



意思很简单就是让此列的数据默认为一定的数据



格式:



alter table 表名称 add constraint 约束名称 约束类型 默认值) for 列名



比方说:emp表中的gongzi列默认为10000



alter table emp add constraint jfsd default 10000 for gongzi



5、外键约束:



因为主键实现了实体的完整性, 外键实现了引用的完整性, 应用完整性规定,所引用的数据必须存在! 比方说一个表名称叫dept 里面有2列数据 一列是ID一列是ENAME



id:表示产品的编号



ename:表示产品的名称



另外一个表格名称是emp 里面有2列数据,一列是ID 一列是DID



id:表示用户号



did:表示购买的产品号



要让emp表中的did列去引用dept表中的id



可以用下面的方法



格式:



alter table 表名 add constraint 约束名称 约束类型 (列名) references 被引用的表名称(列名)



例子:



alter table emp add constraint jfkdsj foreign key (did) references dept (id)





三、即时(immediate)约束与延迟(deferred)约束



deferred:如果 Oracle 在事务提交(commit)时才对约束执行检查,则称此约束是延迟的(deferred)。如果数据违反了延迟约束,提交操作将导致事务被回滚(undo)。 



immediate:如果约束是即时的(immediate)(非延迟的),则此约束将在语句执行结束后进行检查。如果数据违反了延迟约束,语句将被立即回滚。



一般情况下,我们用的约束初始都是immediate型的(默认),而且不好转为deferred型。但是如果初始是deferrable(需要手动指定),那deferred跟immediate 2种状态可以随意转换。



四、约束的四种状态



ENABLE(启用):确保所有输入的数据都遵从约束(constraint) 。



DISABLE(禁用):总是允许输入数据,无论数据是否遵从约束 。



VALIDATE(验证):确保已存在的数据遵从约束 。



 NOVALIDATE(无验证):允许已存在的数据不遵从约束 。



ENABLE VALIDATE 与 ENABLE 相同。Oracle 将检查约束,并保证所有数据均遵从约束。



 ENABLE NOVALIDATE 表示所有新插入或被修改的数据都必须遵从约束,但允许已存在的数据不遵从约束。 DISABLE NOVALIDATE 与 DISABLE 相同。Oracle 不会检查约束.。



DISABLE VALIDATE 将禁用约束,移除约束使用的索引,并禁止修改约束键的数据。 



约束不论哪种类型,要能够生效,必须状态是enable才行。