因为外键在数据库中相对主键比较难理解,主键就是唯一标识一条记录,很好理解;下面来看N个外键实例;
1 学生所属系
student(s#,sname,d#),即学生这个关系有三个属性:学号,姓名,所在系别。
dep(d#,dname),即院系有两个属性:系号、系名。
则s#、d#是主键,也是各自所在关系的唯一候选键,d#是student的外键。
建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。
指定外键关键字: 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列 当外键的值删除 本表中对应的列删除 当外键的值改变 本表中对应的列值改变。
注:在创建表中增加外键的触发事件是不行的,
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id));
========
2 学生-课程-成绩
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键;
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键;
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键;
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则成绩表中的学号是学生表的外键;
同理成绩表中的课程号是课程表的外键;
========
3 身份证号
表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,那么表B的这个字段就叫表A字段的外键,也就是两个表以身份证号这个字段建立了联系。
表A中身份证号字段里面的身份证号一定是唯一的,不能有重复,而表B里面的同一个身份证号可以出现多次。这称为表A身份证号字段与表B身份证号字段建立了一对多的关系。
外键的作用就是可以让身份证号保证是来自表A中,也就是保证了数据的规范性;如果要删除A表中的某个身份证号,那么首先要删除B表中同样的身份证号,这保证了数据的完整性
========
4 客户与订单
a b 两个表
a表中存有客户号,客户名称
b表中存有每个客户的订单
有了外键后
你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x
========
5 子表父表的定义和外键的作用
子表,父表的定义: 拥有外键的表是子表。主键被其它表引用的表是父表。
换句话说:因为父表的标识被很多个子表中的记录引用,所以叫父表。
拥有外键关系,并且可以随便删除数据,不影响其它表的数据的那个表叫子表。
使用的时候谁做为谁的外键,主要从以下两点考虑:
1/,删除是如何相互影响的,删除记录受约束的那个是父表,不受约束的那个是子表;
2/,记录必须先存在的是父表;
两种用途:
1/, 最常用的一种: 减少重复数据.表A中拥有外键,表B的数据基本是不允许删除的.这时选择对 INSERT 和 UPDATE 强制关系即可.
2/,其次,是增加一个从属表. 如果表A删除一条记录时,表B中也随着删除一条相关联的记录,那么外键关系中,表A的主键是表B的外键。这种关系,实际上表B是表A的从属表(即表A是父表),选择对 INSERT 和 UPDATE 强制关系时,如果向表B中插入数据,表A中必须
已经存在对应的记录。选择级联删除相关的字段时,删除表A中的一条记录,就会删除对应的表B中的一条记录。
========
6 学生机房收费系统
学生信息表,卡号为主键;
充值表,退卡表,上下机表,均有卡号字段,以卡号为外键;
只有当学生注册了信息,有了卡号,在学生信息表中存在了,才可以进行充值,退卡,上下机等,主外键的作用也就是当没有学生信息时,我们不可以进行充值等操作,而且想要删除学生信息表中的数据,必须先将充值表,退卡表,上下机表中此卡号的人删除之后才可以
删除学生信息表中的数据,这样就避免了当学生未注册时,就可以充值的情况
也就是说,如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除
FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。
外键是用来控制数据库中数据的数据完整性的 。就是当你对一个表的数据进行操作和他有关联的一个或更多表的数据能够同时发生改变,这就是外键的作用
========
7 连接查询与主外键的关系
连接的 连接条件:A表的主键 = B表的外键如果做连接的两表没有主外键关系,那么连接结果没有意义。
例:学生表和选课表做连接,select *from 学生表,选课表where 学生表.学号(主键)=选课表.学号(外键)
主外键可以建级联级触发器,用来做级联删除、更新。作用原理还是因为主外键将两表联系。
========
8 Person和Order
"Persons" 表:
Id_P
LastName
FirstName
Address
City
1
Adams
John
Oxford Street
London
2
Bush
George
Fifth Avenue
New York
3
Carter
Thomas
Changan Street
Beijing
"Orders" 表:
Id_O
OrderNo
Id_P
1
77895
3
2
44678
3
3
22456
1
4
24562
1
请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
========
9 设备管理信息系统
表1:device设备表
序号 列名 数据类型 长度 主外键 允许空 说明
1 de_no varchar 50 主键 否 设备编号
2 de_name varchar 50 否 设备名称
3 de_brand varchar 50 否 品牌
4 de_btime varchar 50 是 购买时间
5 de_ptime varchar 50 是 生产时间
表3:remian_device可用设备表
序号 列名 数据类型 长度 主外键 允许空 说明
1 remian_num int 4 主键 否 序号
2 de_no varchar 50 外键 否 设备编号
3 de_name varchar 50 否 设备名称
4 de_condition varchar 50 是 设备状态
表4:repair_device设备维修情况表
序号 列名 数据类型 长度 主键 允许空 说明
1 repair_num int 4 主键 否 序号
2 st_no varchar 50 否 维修员工编号
3 de_no varchar 50 外键 否 设备编号
4 destroy_date varchar 50 否 损坏日期
5 repair_condition varchar 50 是 维修状态
设备表以de_no为主键;
可用设备表以de_no为外键;
设备维修情况表以de_no为外键;
========
10 人力资源管理系统
员工表
列名 数据类型及长度 可否为空 说明
BNO CHAR(6) NOT NULL 员工号(主键)
BNAME VARCHAR(10) NULL 员工姓名
BGENDER VARCHAR(2) NULL 性别
BBIRTHDAY DATE NULL 出生日期
BHOMETOWN VARCHAR(8) NULL 籍贯
BNATION VARCHAR(10) NULL 民族
BID CHAR(2) NULL 身份证号
BHEALTH VARCHAR(20) NULL 健康状况
BZZMM VARCHAR(4) NULL 政治面貌
BBLOOD VARCHAR(2) NULL 血型
BHOMEADRESS VARCHAR(10) NULL 家庭住址
BTELENO CHAR(10) NULL 联系电话
学历表
列名 数据类型及长度 可否为空 说明
CNO CHAR(6) NOT NULL 员工号(外键)
CGREENO CHAR(15) NOT NULL 学位证书编号(主键)
CXL CHAR(6) NULL 学历
CAJOR VARCHAR(10) NULL 专业
CBYDATE DATE NULL 毕业时间
CBYSCHOOL VARCHAR(20) NULL 毕业院校
部门表
列名 数据类型及长度 可否为空 说明
DNO CHAR(6) NOT NULL 员工号(外键)
DDNO CHAR(6) NOT NULL 部门号(主键)
DNAME VARCHAR(10) NULL 部门名称
DADD VARCHAR(20) NULL 部门地址
DTIME DATE NULL 参加工作时间
此例中,
员工表,员工号为主键;
学历表,学位证书编号为主键;员工号关联员工表,为外键;
部门表,部门号为主键;员工号关联员工表,为外键;