N个数据库外键实例

因为外键在数据库中相对主键比较难理解,主键就是唯一标识一条记录,很好理解;下面来看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        参加工作时间 


此例中,
员工表,员工号为主键;
学历表,学位证书编号为主键;员工号关联员工表,为外键;
部门表,部门号为主键;员工号关联员工表,为外键;


你可能感兴趣的:(原创教程,数据库,数据库,主外键,外键,设备管理)