甲骨文定义约束

外键约束保证参照完整性。外键约束限定了一个列的取值范围。一个例子就是限定州名缩写在一个有限值集合中,这个值集合是另外一个控制结构,一张父表

,,,下面我们创建一张参照表,它提供了完整的州缩写列表,然后使用参照完整性确保学生们有正确的州缩写。第一张表是州参照表、状态作为主键

,

: ora - 02291

,

,

的关键一部分。一个既不是其他表的父表也不是子表的表是非常少的。

<强>

<强>,,,三、参照字段语法结构

,,,创建外键约束是,外键字段参照父表的主键或惟一约束字段。这种情况下可以不指定外键参照字段名,如下:ALTER TABLE学生添加约束fk_students_state外键(状态)引用state_lookup;当没有指定参照字段时,默认参照字段是父表的主键。

,,,如果外键字段参照的是独特的而非主键字段,必须在添加约束语句中指定字段名。

,,, <强>四,不同用户模式和数据库实例间的参照完整性

,,,外键约束可以在不同用户模式及不同数据库实例间应用,但从一个数据库观点来说,这是不希望的。一个应用放在一个用户模式下是比较合适的。这里不再详述

,

,

,

,

,

,,,参照完整性规则在父表更新删除期间和子表插入更新期间强制执行。被参照完整性影响的语句是:PARENT-UPDATE ,父表更新操作,不能把State_lookup表中值的状态更新为学生表仍在使用而State_lookup表中却没有的值。

,,,PARENT-DELETE ,父表删除操作,不能删除State_lookup表中值的状态后导致学生表仍在使用而State_lookup表中却没有这个值。

,,,CHILD-INSERT ,,子表插入操作,不能插入一个state_llokup表中没有的状态的值CHILD-UPDATE ,,子表更新操作,不能把状态的值更新为state_lookup表中没有的状态的值

,,,下面示例说明四种错误类型:

,,,表结构及测试数据如下:

,

CREATE TABLE state_lookup
(state ,,,,VARCHAR2 (2),
,state_desc VARCHAR2(30))表空间student_data;

ALTER TABLE state_lookup
,添加主键约束pk_state_lookup(状态)
,使用索引表空间student_index;

,,,然后插入几行记录:

插入state_lookup值(“CA”、“加州”);
插入state_lookup值(“纽约”,“纽约”);
插入state_lookup值(“数控”,“北卡罗来纳”);

,,,我们通过实现父子关系来保证参照完整性,图示如下

, - - - - - - - - - - - - - - - -女人,,外键字段存在于学生表中
| State_lookup |,是状态字段
- - - - - - - - - - - - - - - -女人,,一个外键必须参照主键或唯一的字段
, |,,,,,,,,,,这个例子中,我们参照的是状态字段
, |,,,,,,,,,,它是一个主键字段(参看DDL)
,,,,,,,,,,/|/
, - - - - - - - - - - - - - - - - - -
|,Students ,,|
, - - - - - - - - - - - - - - - - - -

,,,学生上图显示了State_Lookup表和表间一对多的关系,State_Lookup表定义了州缩写通用集合,在表中每一个州出现一次,因此,State_Lookup表的主键是状态字段。

,,,State_Lookup表中的一个州名可以在学生表中出现多次。有许多学生来自同一个州,一次,在表State_Lookup和学生之间参照完整性实现了一对多的关系。

,,,外键同时保证学生表中状态字段的完整性。每一个学生总是有个State_lookup表中成员的州缩写。

,,,外键约束创建在子表。下面在学生表上创建一个外键约束.State字段参照state_lookup表的主键。

创建表学生
(student_id ,,VARCHAR2 (10) NOT NULL,
student_name VARCHAR2 (30) NOT NULL,
college_major VARCHAR2(15)不是NULL,
status ,,,,,,VARCHAR2 (20) NOT NULL,
state ,,,,,,,VARCHAR2 (2),
license_no ,,VARCHAR2(30))表空间student_data;

甲骨文定义约束