表中的外键就是对于该属性所对应的域的限制,对于插入到表中的该属性的数据进行约束。并且该外键映射于所对应的另一张表的能唯一标识每一条数据的主键,根据参照完整性规则,外键可以取空值或者取对应主键的数值。外键的作用可以认为使两张表产生一定的关系。下面介绍如何设置外键约束
1.创建表时就设置外键约束。
为了插入数据不规范报错能够更快的找到错误的地方,外键一般都会设置一个别名来表示外键约束。外键所引用的另一个表的属性要是主键。
我们可以直接在创建表时,声明属性的右边像写主键,unique, not null 约束一样设置外键约束。 这个时候就不用写入foreign key来表示该约束是外键约束。
格式为
create table xxx(
属性名 属性类型 constraint 外键名 references 主键表 (主键名)
);
下面我们来演示一下,有一个student表,里面有pid是主键表示学生的学号,pname是学生名字。另一个表是s_course表用来表示学生所选的课程,其中pid表示学生的学号对应于student表中的pid 就是该表的外键,另一个cname就是表示课程名。
--学生表
create table student(
pid varchar2(10) primary key,
pname varchar2(10)
);
--学生选择课程
create table s_course(
pid varchar(10) constraint FK_pid references student(pid),
cname varchar(20)
);
我们对其两个表插入数据
insert into student values('A001','我');
insert into s_course value ('A001','数据库概述');
发现上述的sql语句是可以执行成功的。
但当我们插入课程表时,插入的学号不是空且学生表中学号没有的值时,就会报错。
insert into s_course values('A002','软件工程');
另一个在表中设置约束的方法就是等表中所有属性全部声明完后,将外键约束写在表中的最后面,这个时候就需要指明foreign key 了。
格式为:
create table xxx(
..... ,
constraint 外键名 foreign key (外键属性) references 主键表(主键名)
);
也来演示一下效果,像上述的student表和s_course表我们对其进行修改。
drop table student;
drop table s_course;
--学生表
create table student(
pid varchar2(10) primary key,
pname varchar2(10)
);
--学生选择课程
create table s_course(
pid varchar(10) ,
cname varchar(20),
constraint FK_pid foreign key (pid) references student(pid)
);
插入数据也没有问题。
insert into student values('A001','我');
insert into s_course values ('A001','数据库概述');
2.在表外设置外键约束。
当我们创建了表之后,发现需要有一个外键约束,在不重新建表的前提下我们就可以通过alter语句来增加该属性的约束条件。外键也是约束。
格式为:
alter table 外键表名 add constraint 外键名 foreign key (外键表外键属性名) references 主键表名(主键名)
下面进行演示一下效果,该例子也是用到了上述的student表和s_course表。
drop table student;
drop table s_course;
--学生表
create table student(
pid varchar2(10) primary key,
pname varchar2(10)
);
--学生选择课程
create table s_course(
pid varchar(10),
cname varchar(20)
);
alter table s_course add constraint FK_pid foreign key (pid ) references student(pid);
插入数据测试也是可以通过的。
insert into student values('A001','我');
insert into s_course values ('A001','数据库概述');