约束

5.1.空值约束

NOT NULL:默认情况下,表中的所有列均允许使用空值。单词null表示没有值。NOT NULL约束条件要求表列必须包含非空值。

例如,可以通过定义NOT NULL约束条件来要求在EMPLOYEES表的每一行的LAST_NAME列中输入值。

alter table employees modify last_name not null

5.2.唯一性约束

UNIQUE键:UNIQUE键完整性约束条件要求一列或一组列(键)中的每个值必须唯一,即在指定的列或一组列中,表任意两行的值不重复。

例如,对DEPARTMENTS表的DEPARTMENT_NAME列定义了UNIQUE键约束条件,以便禁止行出现重复的部门名称。除了特殊情况,将与唯一索引一起强制使用这个约束条件。alter table departments add constraint department_name_ukunique(department_name)

5.3.主键约束

PRIMARY KEY:数据库中的每个表最多可包含一个PRIMARYKEY约束条件。在这个约束条件的限制下,单个列或一组列中的值就构成了行的唯一标识符。事实上,每行的名称均由其主键值确定。

alter table departments add constraintdepartments_pk primary key (DEPARTMENT_ID);

5.4外键约束

引用完整性约束条件:关系数据库中的各个表通过公用列相互关联,因此必须维护用于管理列关系的规则。使用引用完整性规则可确保保留这些关系。

对于每个表行,引用完整性约束条件要求外键中的值必须与父键中的值匹配。

例如,对EMPLOYEES表的DEPARTMENT_ID列定义了一个外键。它保证这一列中的每个值一定与DEPARTMENTS表主键中的值匹配。因此,在EMPLOYEES表的DEPARTMENT_ID列中不会存在错误的部门编号。

另一类引用完整性约束条件被称为自引用完整性约束条件。此类外键引用同一表中的父键。

5.5 检查性约束

检查约束条件:单个列或一组列的CHECK完整性约束条件要求为每个表行指定的条件必须为真或未知。

如果某个数据操纵语言(DML) 语句导致IMMEDIATE约束条件的计算结果为FALSE,则会回退该语句。如果约束条件为可延迟的并设置为DEFERRED,则在提交时而不是执行DML 时发生回退。

5.6约束的状态

完整性约束条件可处于以下一种状态:

DISABLE NOVALIDATE

DISABLE VALIDATE

ENABLE NOVALIDATE

ENABLE VALIDATE

5.6.1 DISABLE NOVALIDATE

不检查新数据和现有数据,因此这些数据可能不符合约束条件。

当数据来自验证过的源,而且表是只读表时,通常会使用此状态。因此,不会将新数据输入表中。在已清理了数据的数据仓库环境中使用NOVALIDATE。此时不需要进行验证,因而可以节省很多时间

5.6.2 DISABLE VALIDATE

如果约束条件处于此状态,则不允许对有约束条件的列进行任何修改。因为如果在验证现有数据后,又允许将未经检查的数据输入表中,就会出现不一致的情况。通常,在必须验证现有数据但不进行修改时,以及不需要索引来提高性能时,可使用此状态。

5.6.3 ENABLE NOVALIDATE

新数据符合约束条件,但现有数据处于未知状态。通常在确信表中只存在纯净数据和符合规则的数据的情况下使用该状态,此时不需要进行验证。但是,不允许将违反规则的新数据输入到系统中。

5.6.4 ENABLE VALIDATE

新数据与现有数据均符合约束条件。这是约束条件的典型状态和默认状态。

5.7约束条件检查

延迟约束条件和非延迟约束条件

可以将约束条件的有效性检查延迟到事务处理结束时。

非延迟约束条件又称“即时约束条件”,是在每个DML 语句结束时强制执行的。违反约束条件会导致回退语句。如果约束条件导致诸如deletecascade等操作,则此操作会在导致其执行的语句执行时执行。

定义为“非延迟”的约束条件不能更改为延迟约束条件。

对于非延迟约束条件,主键约束条件和唯一键约束条件需要唯一的索引;如果某列或某几列已有一个非唯一索引,则将使用该索引。

延迟约束条件是提交事务处理时才检查的约束条件如果在提交时检测到任何违反约束条件的情况,则会回退整个事务处理。当同时输入外键关系中的父行和子行(如在订单录入系统中,需要同时录入订单和订单中的各个项目)时,这些约束条件非常有用。对于延迟约束条件,主键和唯一键需要不唯一的索引;如果某列或某几列具有唯一的索引,则创建约束条件时会失败,因为这些索引不能被延迟。

可以将定义为“延迟”的约束条件指定为下列方式之一:

Initially immediate,指定在默认情况下,约束条件必须用作即时约束条件,除非显式设置为其它方式。

Initially deferred,指定在默认情况下,只在事务处理结束时强制使用约束条件。

注:如果该列已存在适当的索引,则将它用于约束条件。不需要为主键和唯一键创建附加索引。

检查约束条件的时机:

•执行语句时(对于非延迟约束条件)

•发出COMMIT时(对于延迟约束条件)

案例:DML 语句后接COMMIT

5.8使用SQL 创建约束条件

示例

a. ALTER TABLE countries ADD (UNIQUE(country_name)  ENABLE NOVALIDATE);

执行此语句后,对COUNTRIES表执行的任何插入或更新操作都必须具有唯一的COUNTRY_NAME值。但是,有可能在发出此语句时,表中已存在非唯一的COUNTRY_NAME值。NOVALIDATE关键字指示应忽略这些值。仅新行受到约束条件的约束。

b. ALTER TABLE shopowner.jobs ADD CONSTRAINTjob_pk PRIMARY KEY (job_id);

此语句向JOBS表添加主键。约束条件名称为JOB_PK,主键为JOB_ID列。

c.CREATE TABLE emp (emp_no NUMBER PRIMARYKEY,Last_name

VARCHAR2(30), first_name VARCHAR2(30),dept_no NUMBER,

Mgr_no NUMBER, hire_date date,salaryNUMBER,

CONSTRAINT Mgr_FK FOREIGNKEY (mgr_no)REFERENCES

emp(emp_no),CONSTRAINT ck1CHECK (salary> 0));

此语句在创建表时定义约束条件,而不是以后使用ALTER TABLE语句进行定义。

MGR_FK约束条件确保MGR_NO列中的值必须存在于表的主键列中。CK1约束条件确保SALARY大于零。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值