MySql中的外键foreign key
一、首先创建三张表,并插入相应的数据:
create table student( sid int(10) primary key not null, name char(120), sex char(120), dept char(120) ); 插入数据 insert into student values (1,"mmm","nan","jisuanji dept"); insert into student values (2,"nnnn","nv","jiusanji dept"); insert into student values (3,"sss","nan","jisuanji dept"); 创建一张课程表 create table course( cid int(10) primary key not null, cname char(120), ccredit int(10) ); 插入数据: insert into course values (11,"jisuanji",10); insert into course values (12,"C_yuyan",8); insert into course values (13,"C++",9); 创建学生选课表 create table stucourse( scid int(10) primary key not null, sid int(10), cid int(10), [constraint sid_fk] foreign key(sid) references student(sid), [constraint cid_fk] foreign key(cid) references course(cid), grade int(10) ); 插入数据 insert into stucourse values (1,1,11,90); insert into stucourse values (2,1,12,88); insert into stucoruse values (3,2,13,86); insert into stucourse values (4,3,11,78); <!--或者在创建完三张表之后再加外键--> alter table stucourse add [constraint sid_fk] foreign key (sid) references student (sid); alter table stucourse add [constraint cid_fk] foreign key (cid) references student (cid); <!--删除外键--> alter table stucourse drop foreign key 外键名字;
在第三张表stucourse里面,设置了 stucourse 的外键链接,分别引用了 student 的 sid 外键 和 course 的 cid 外键。
在设置外键的默认情况下,你插入表stucourse 一条数据必需要求其外键字段值在表student 和表course 的相对应的外键链接字段能找到,否则插入失败。并且当 stucourse 表里面没有插入相关数据的时候,删除或修改student 表或者是 course 表里面的一条记录或者字段,是可以的,但是一旦 stucourse 表里面添加了相关数据,即:从表创建外键的字段引用了主表的外键链接字段值,那么就不能删除或修改 student 表 和 course 表里面对应的一条记录了。这就是所谓的保持数据的一致性和完整性。
1、外键的默认作用有两点:
① 对从(子)表(外键所在的表)的作用:从表在进行写操作的时候,如果外键字段在主表中找不到对应的匹配,操作就会失败。
② 对主(父)表的作用:对主表的外键链接字段进行删和改时,如果对应的该字段在从表中被引用,操作就会失败。
1、使用外键的使用规则:
① 表储存引擎必须是innodb,否则创建的外键无约束效果。
② 外键的列类型必须与父表的主键类型完全一致。
③ 外键的名字不能重复,即:外键必须是主表的唯一键。注意:从表引用外键的字段不一定须为其主键,主表的外键也不一定须为其主键。
④ 子表已经存在数据的字段被设为外键时,必须保证字段中的数据与主表的外键数据对应起来。
2、外键的定制作用(三种约束模式):
① district:严格模式(默认), 父表不能删除或更新一个被子表引用的记录。
② cascade:级联模式, 父表操作后,子表关联的数据也跟着一起操作。
③ set null:置空模式,前提外键字段允许为NLL, 父表操作后,子表对应的字段被置空。
3、使用外键的优缺点
优点:① 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
② 有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
③ 外键在一定程度上说明的业务逻辑,会使设计周到具体全面。
缺点:影响数据库在insert,update,delete数据的时的性能。
eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不 止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!
结论:① 在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
② 用外键要适当,不能过分追求(可以用触发器或应用程序保证数据的完整性)。
参考文章:
https://www.cnblogs.com/wasayezi/p/7412049.html
https://www.cnblogs.com/pengyin/p/6375860.html
https://www.cnblogs.com/brucemengbm/p/6897410.html