在关系型数据库中的每一个表都具备这样的特点, 在同一个表中没有完全一致的两行数据, 当一行数据可以有少数几个属性确定的话,这几个属性就可以成为主键, 设立了表的主键之后,数据库系统会为主键的列建立索引和制约, 利用主键进行检索的速度是最快的.
如果有两个表AB, 他们之间存在着某种对应关系,这种关系可以是A中一行记录对应于B中的一行记录,也可以是A的一行记录对应于B的多行记录,还可以是A的多行对应于B的多行,在关系型数据库中, 这种对应关系也要做成关系表,下面就一对一, 一对多, 多对多几种情况来说明一下关系表
一对一
表A(学号, 姓名)
表B(学号, 学习成绩)
表A是一份学生名单, 学号是主键
表B是一份成绩单, 学号也是主键,这样两个表就是一对一的关系, 反映出这一关系的是学号, 如果把表A做为主表的话, 表B的学号就是外键了
一对多
表A(班级, 人数)
表B(学号, 姓名)
表A是一份班级列表, 表B是一分学生名单,每个学生都属于某一个班级, 而一个班级可以有很多学生
为了表示这样的关系, 可以做一个关系表C(学号,班级) 其中,学号是主键, 这就保证了一对多的关系, 而学号和班级, 都是外键, 由于B,C
多对多
表A(课程, 学分)
表B(学号, 姓名)
表A是一份课程表
表B是份名单, 一个学生可以选多门课程,一门课程中也可以有很多学生, 为了反映这样的关系建立表C(课程,学号)其中课程和学号都是主键,这就保证了多对多的关系, 同时他们也是外键
对外键的更新和删除, 也就有了下面两种制约
- 级联, 当删除了主表的主键之后, 同时也删除关系表中的外键, 比如,删除了一对多的例子中删除了班级, 系统会自动删除关系表C中含有该班级的所有记录
- 制约, 只有当关系表中没有与该主键对应的外键时才允许删除该主键,再比如, 在一对多的例子中, 想删除某一班级的话,就必须先删除关系表C中所有含该班级的记录
建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。
指定主键关键字: foreign key(列名)
引用外键关键字: references <外键表名>(外键列名)(被参考的表)
事件触发限制: on delete和on update ,可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action
例如:
outTable表 主键 id类型 int
创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。