一个班级的学生我的信息表:数据库
为了一张表记录的数据不要太过冗余。模块化
这和软件project的模块化思想差点儿相同相似,仅仅只是在数据库中是对表关系进行解耦,尽可能让表 记录的数据单一化。就如你贴的图片中,把成绩和学生信息放在一张表中就太冗余了。post
你想一想,你的图中的第一章表切割成了表1和表2,表2的学号引用了表1的学号字段做为外键,假设不创建外键,仅仅是和表1同样单纯性地设立一个学号字段,那么和创建外键有什么差异呢?spa
比方表1中张三的学号为20140900001。那么我在表2中插数据的时候在学号字段插20140900001来记录张三的成绩不也是作到了表的解耦了吗?设计
这里存在的问题是,在不设置外键的状况下。表2的学号字段和表1的学号字段是没有关联的。仅仅是你本身以为他们有关系而已,数据库并不以为它俩有关系。也就是说,你在表2的学号字段插了一个值(比方20140999999),但是这个值在表1中并无,这个时候,数据库仍是赞成你插入的,它并不会对插入的数据作关系检查。然而在设置外键的状况下,你插入表2学号字段的值必须要求在表1的学号字段能找到。同一时候,假设你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,不然就无法删除。图片
这就是所谓的保持数据的一致性和完整性。你想,假设表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号相应的学生是哪一个学生。数据的一致性还包含数据类型的一致性(这个见如下就知道了)。get
外键不必定需要做为从表的主键。外键也不必定是主表的主键。主表的惟一键就可以做为从表的外键。it
一、外键是属于约束的一种,所谓约束顾名思义,就是限制你在数据库的操做。而你对数据库有什么操做,无非是增、删、改、查。外键起的做用就是让你在数据库帮助的状况下更合理的添加数据的正确度。 二、因此,外键仅仅是辅助,假设A表的id字段设置为B表id的外键。仅仅是创建了一种约束关系,在建表的时候,即便A表id字段创建后,B表也要创建id字段。io
三、外键的做用是能够避免例如如下状况。table
如 【班级信息表】存放的是班级信息表。
【学生表】存放的是学生信息,包括班级信息。
这个时候 在【学生表】中存放的班级信息应该在【班级信息表】存在才合法,本身人为控制的话不免有漏掉的状况,用外键则可让数据库本身主动控制,当插入【学生表】中的数据在【班级信息表】不存在的时候,数据库不一样意插入。
创建方法
可以在建立表的时候建立,也可以在建立表以后建立。 建立表时建立: create table student (id int primary key, name char(4), dept char(9) sex char(4)) create table grade (id int , grade int constraint id_fk foreign key (id) references student (id) ) 或建立了两表以后再建 alter table grade add constraint id_fk foreign key (id) references student (id)