数据库

外键约束保证参照完整性。外键约束限定了一个列的取值范围。一个例子就是限定州名缩写在一个有限值集合中,这个值集合是另外一个控制结构——一张父表
下面我们创建一张参照表,它提供了完整的州缩写列表,然后使用参照完整性确保学生们有正确的州缩写。第一张表是州参照表,State作为主键
CREATE TABLE state_lookup
 (state      VARCHAR2(2),
  state_desc VARCHAR2(30)) TABLESPACE student_data;

ALTER TABLE state_lookup
  ADD CONSTRAINT pk_state_lookup PRIMARY KEY (state)
  USING INDEX TABLESPACE student_index;
然后插入几行记录:
INSERT INTO state_lookup VALUES ('CA', 'California');
INSERT INTO state_lookup VALUES ('NY', 'New York');
INSERT INTO state_lookup VALUES ('NC', 'North Carolina');
我们通过实现父子关系来保证参照完整性,图示如下:
                   ---------------   外键字段存在于Students表中
                   |State_lookup  |  是State字段
                   ---------------   一个外键必须参照主键或Unique字段
                         |           这个例子中,我们参照的是State字段
                         |           它是一个主键字段(参看DDL)
                        /|\
                   ---------------
                   |  Students    |
                   ---------------
上图显示了State_Lookup表和Students表间一对多的关系,State_Lookup表定义了州缩写通用集合——在表中每一个州出现一次。因此,State_Lookup表的主键是State字段.
State_Lookup表中的一个州名可以在Students表中出现多次。有许多学生来自同一个州,一次,在表State_Lookup和Students之间参照完整性实现了一对多的关系。
外键同时保证Students表中State字段的完整性。每一个学生总是有个State_lookup表中成员的州缩写。
外键约束创建在子表。下面在students表上创建一个外键约束。State字段参照state_lookup表的主键.
1、创建表
CREATE TABLE students
 (student_id    VARCHAR2(10) NOT NULL,
  student_name  VARCHAR2(30) NOT NULL,
  college_major VARCHAR2(15) NOT NULL,
  status        VARCHAR2(20) NOT NULL,
  state         VARCHAR2(2),
  license_no    VARCHAR2(30)) TABLESPACE student_data;
2、创建主键
ALTER TABLE students
  ADD CONSTRAINT pk_students PRIMARY KEY (student_id)
  USING INDEX TABLESPACE student_index;
3、创建Unique约束
ALTER TABLE students
  ADD CONSTRAINT uk_students_license
  UNIQUE (state, license_no)
  USING INDEX TABLESPACE student_index;
4、创建Check约束
ALTER TABLE students
   ADD CONSTRAINT ck_students_st_lic
   CHECK ((state IS NULL AND license_no IS NULL) OR
          (state IS NOT NULL AND license_no is NOT NULL));
5、创建外键约束
ALTER TABLE students
  ADD CONSTRAINT fk_students_state
  FOREIGN KEY (state) REFERENCES state_lookup (state);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值