本文实例讲述了mysql外键基本功能与用法。分享给大家供大家参考,具体如下:
本文内容:
什么是外键 外键的增加 外键的修改和删除 外键的约束模式首发日期:2018-04-12
什么是外键:
外键就是表中存在一个字段指向另外一个表的主键,那么这个字段就可以称为外键。 一张表可以有多个外键。 外键用于约束表与表之间的关系,可以说外键是表之间的映射关系,这个关系可以帮助我们处理表之间关系的紧密性和存在性(比如学生表的cid班级号与班级表的id建立关联,cid应该不能为不存在的,如果不增加外键cid,没有建立上关系,我们就不知道班级号不存在。)。 或者说,外键是告诉数据库系统,我们所认为的关系,单纯的数据,系统是不知道实际意义的,外键就是告诉系统应该如何处理他们的关系。 所以,外键的核心是约束。外键的增加:
创建外键的前提是该字段首先是一个索引,如果不是的话,创建外键是会创建成一个普通索引【所以可以不在意】。 创建外键的另外一个前提是“指向表”已经创建,对于一个不存在的表,将无法使用外键对应上。 增加的方式: 1.在创建表的时候定义,在所有字段定义结束后使用foreign key(外键字段) references 指向表(主键)来 定义,比如
create table student( id int primary key auto_increment, name varchar(15) not null, gender varchar(10) not null, cid int, foreign key(cid) references class(id) );
create table class( id int primary key auto_increment, cname varchar(15) );
补充:
在Mysql中,如果存储引擎不是innodb,那么无法使外键的约束作用生效,即使是能成功增加外键。 外键名不能重复,所以不建议使用constraint 外键名字外键的修改与删除:
修改:不能修改外键信息,如外键指向之类的,只能先删除再新增。 删除语法:alter table 表名 drop foreign key 外键名; 这里的外键名不是外键字段,而是外键名。如果没有使用constraint来定义,可以通过show create来查看表创建语句中系统定义的外键名。
补充:
删除外键时,如果使用desc会看到表结构还有MUL,那是一个索引。因为创建外键时,字段会被创建成一个索引。如果不想保留,可以使用drop index 字段名 on 表名.外键的约束模式:
外键是用来约束表之间的关系的。 (约定创建外键的表称为子表,指向的表称为父表) 针对子表:可以约束子表的插入和修改【这种约束是父表对子表的约束】 涉及到外键的插入和修改时,如果外键字段找不到对应的匹配那么会插入\修改失败(像插入选课记录不可能插入一门课程表中没有的课程)。 比如:
foreign key(外键字段) references 父表 (主键) on delete set null on update cascade;
-- 实验表结构 create table class( id int primary key auto_increment, cname varchar(15) ); create table student2( id int primary key auto_increment, name varchar(15) not null, gender varchar(10) not null, cid int, foreign key(cid) references class(id) on delete set null on update cascade ); -- 实验表数据: insert into class(cname) values("python"),("linux"),("java"),("html5"); insert into student2(name,gender,cid) values("Alice","female",1); insert into student2(name,gender,cid) values("John","female",2); insert into student2(name,gender,cid) values("Jack","female",3); insert into student2(name,gender,cid) values("Amy","female",4); select * from student2; select * from class; -- 尝试更新级联 update class set id = 6 where cname="python"; select * from student2; -- 结果原来的python的cid=6 -- 尝试删除置空 delete from class where cname="java"; select * from student2; -- 结果原来的java的cid=null
补充:
需要设置好约束模式,不要在多个子表中使用不同的约束模式,不然会冲突。更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》
希望本文所述对大家MySQL数据库计有所帮助。