一个班级的学生个人信息表:
什么是外键
在设计的时候,就给表1添加一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表 。
外键用来干什么
为了一张表记录的数据不要太过冗余。这和软件工程的模块化思想差不多类似,只不过在数据库中是对表关系进行解耦,尽量让表 记录的数据单一化。就如你贴的图片中,把成绩和学生信息放在一张表中就太冗余了。
为什么说外键能保持数据的一致性、完整性
你想想,你的图中的第一章表分割成了表1和表2,表2的学号引用了表1的学号字段作为外键,如果不建立外键,只是和表1一样单纯性地设立一个学号字段,那么和建立外键有什么区别呢?
比如表1中张三的学号为20140900001,那么我在表2中插数据的时候在学号字段插20140900001来记录张三的成绩不也是做到了表的解耦了吗?
这里存在的问题是,在不设置外键的情况下,表2的学号字段和表1的学号字段是没有关联的。只是你自己认为他们有关系而已,数据库并不认为它俩有关系。也就是说,你在表2的学号字段插了一个值(比如20140999999),但是这个值在表1中并没有,这个时候,数据库还是允许你插入的,它并不会对插入的数据做关系检查。然而在设置外键的情况下,你插入表2学号字段的值必须要求在表1的学号字段能找到。同时,如果你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。这就是所谓的保持数据的一致性和完整性。你想,如果表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号对应的学生是哪个学生。数据的一致性还包括数据类型的一致性(这个见下面就知道了)。
外键的使用规则
从表的字段必须与外键类型相同(如上,分数表 stu 的类型必须和学生表 sid 的类型相同,比如都是 int(10) 类型);外键必须是主表的唯一键(如上,学生表 sid 是主键,而主键是唯一的,所以可以作为分数表 stu 的外键);有关联的字段(如上,分数表之所以使用学生表的 sid 是因为两者有关联,分数表记录的是学生的分数,而学生可以用 sid 来唯 一标识);避免使用复合键(也就是说从表可以同时引用多个主表的字段作为一个外键,一般不推荐这种做法)。 外键不一定需要作为从表的主键,外键也不一定是主表的主键,主表的唯一键就可以作为从表的外键。
1、外键是属于约束的一种,所谓约束顾名思义,就是限制你在数据库的操作。而你对数据库有什么操作,无非是增、删、改、查,外键起的作用就是让你在数据库帮助的情况下更合理的增加数据的正确度。 2、所以,外键只是辅助,如果A表的id字段设置为B表id的外键,只是建立了一种约束关系,在建表的时候,即使A表id字段建立后,B表也要建立id字段。 3、外键的作用是能够避免如下情况。 如 【班级信息表】存放的是班级信息表。 【学生表】存放的是学生信息,包含班级信息。 这个时候 在【学生表】中存放的班级信息应该在【班级信息表】存在才合法,自己人为控制的话难免有漏掉的情况,用外键则可以让数据库自动控制,当插入【学生表】中的数据在【班级信息表】不存在的时候,数据库不允许插入。
建立方法
可以在创建表的时候创建,也可以在创建表之后创建。 创建表时创建: 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)