mysql外键基本功能与用法详解

本文实例讲述了mysql外键基本功能与用法。分享给大家供大家参考,具体如下:

本文内容:

  • 什么是外键
  • 外键的增加
  • 外键的修改和删除
  • 外键的约束模式

首发日期:2018-04-12


什么是外键:

  • 外键就是表中存在一个字段指向另外一个表的主键,那么这个字段就可以称为外键。
  • 一张表可以有多个外键。
  • 外键用于约束表与表之间的关系,可以说外键是表之间的映射关系,这个关系可以帮助我们处理表之间关系的紧密性和存在性(比如学生表的cid班级号与班级表的id建立关联,cid应该不能为不存在的,如果不增加外键cid,没有建立上关系,我们就不知道班级号不存在。)。
  • 或者说,外键是告诉数据库系统,我们所认为的关系,单纯的数据,系统是不知道实际意义的,外键就是告诉系统应该如何处理他们的关系。
  • 所以,外键的核心是约束。

外键的增加:

  • 创建外键的前提是该字段首先是一个索引,如果不是的话,创建外键是会创建成一个普通索引【所以可以不在意】。
  • 创建外键的另外一个前提是“指向表”已经创建,对于一个不存在的表,将无法使用外键对应上。
  • 增加的方式:
    • 1.在创建表的时候定义,在所有字段定义结束后使用foreign key(外键字段) references 指向表(主键)来 定义,比如
    • 2.也可以修改字段来增加: alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);
      • constraint 外键名字:可以帮助定义外键的名字,但不建议使用,因为要求外键名都唯一,而使用系统自定义的绝对不会重复,
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 表名.

外键的约束模式:

  • 外键是用来约束表之间的关系的。
  • (约定创建外键的表称为子表,指向的表称为父表)
    • 针对子表:可以约束子表的插入和修改【这种约束是父表对子表的约束】

      • 涉及到外键的插入和修改时,如果外键字段找不到对应的匹配那么会插入\修改失败(像插入选课记录不可能插入一门课程表中没有的课程)。
      • 比如:
    • 针对父表:可以约束父表的删除和更新,通常有可以以下几种约束模式。【这种约束是子表对父表的约束】
      • 模式:

        • strict严格模式:涉及到外键的删除和更新时,如果对应记录的主键数据已经被子表使用时,那么无法删除(像已经有人入学了某个班级,学校不可能犯傻去把某个班级删除,只能删除那些没人入学的班级。)
        • cascade级联模式:涉及到外键的删除和更新时,如果字段已经被子表使用,子表中的数据会对应更新(像某个班改了班号,那么学生表中的班别都对应更改;如果某个班被删除,就删除对应班的所有学生)
        • set null置空模式:涉及到外键的删除和更新时,如果字段已经被子表使用,那么子表中的外键数据会置空(像某个班被删掉了,不应该删掉所有学生,而是应该给他们先置空再重新分配班别)【子表允许置空的前提是该字段允许为空】
      • 其实可以给不同操作指定不同模式
      • 综上所述(根据我的那些举例),实际上,合适的举措是删除时置空(即使某个班太垃圾了,想删除某个班,但也不应该将所有学生退学,而是将它们分到别的班),修改时级联(允许更改班号,而且更改会更新到学生中)
      • 不同操作设置不同模式的设置方法(在子表中操作):foreign key(外键字段) references 父表(主键) 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数据库计有所帮助。

(0)

相关推荐

  • MySQL外键使用及说明详解

    一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立: 3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以: 外键的好处: 可以使得两张表关联,保证

  • MySQL外键约束常见操作方法示例【查看、添加、修改、删除】

    本文实例讲述了MySQL外键约束常见操作方法.分享给大家供大家参考,具体如下: 1. 查看数据库表创建的sql语句 show create table vip 2. 查看外键的约束名 CREATE TABLE `vip` ( `id` int(11) NOT NULL AUTO_INCREMENT, `address` varchar(255) DEFAULT NULL, `code` varchar(255) DEFAULT NULL, `mobile` varchar(255) DEFAUL

  • MySQL外键使用详解

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持外键约束 (2)外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作: (3)外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! (4)建立外键的前提: 两个表必须是InnoDB表类型. 使用在外键关系的域必须为索

  • MySQL使用外键实现级联删除与更新的方法

    本文实例讲述了MySQL使用外键实现级联删除与更新的方法.分享给大家供大家参考,具体如下: MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更

  • 深入mysql外键关联问题的详解

    今儿继续再看老师给推荐的深入浅出mysql数据库开发这本书,看到innodb数据库的外键关联问题时,遇到了一个问题,书上写的是可以对父表进行修改,从而同步到子表的外键上去,可是自己的实验却是没有能够. 复制代码 代码如下: mysql> show create table country\G*************************** 1. row ***************************       Table: countryCreate Table: CREATE

  • MySQL删除外键问题小结

    MySQL:MySQL不能删除外键,抱错Error on rename of ./ruler/test2child to ./ruler/#sql2-298-92 (errno: 152) 曾经这是MySQL的一个bug,但是现在只是MySQL的一个不友好的地方. 例子如下: mysql> ALTER TABLE ruler.test2child DROP FOREIGN KEY test; ERROR 1025 : Error on rename of ''./ruler/test2child

  • MySQL 创建主键,外键和复合主键的语句

    1.创建主键语法 ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名); 2.创建外键语法 ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[约束名] FOREIGN KEY (info_id)[子表列] REFERENCES news_type[主表名] (id)[主表列] ; 3.使用组合主键 如果一列不能唯一区分一个表里的记录时,可以考虑多个

  • 详解MySQL中的外键约束问题

    使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建.检索.更新和删除等操作都是些比较简单的过程.理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务器端脚本语言,就足以应付对MySQL表所需的各种操作了,尤其是当您使用了快速MyISAM数据库引擎的时候.但是,即使在最简单的情况下,事情也要比我们想象的要复杂得多.下面我们用一个典型的例子进行说明.假设您正在运行一个博客网站,您几乎天天更新,并且该站点允许访问者评论您的帖子. MySQL外键约束条件

  • MySQL删除有外键约束的表数据方法介绍

    在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...) 这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. 禁用外键约束,我们可以使用: SETFOREIGN_KEY_CHECKS=0; 然后再删除数据 启动外键约束,我们可以使用: SETFOREIG

  • mysql建立外键

    建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键). 外键作用: 使两张表形成关联,外键只能引用外表中的列的值! 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名>(外键列名) 事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action 例如: outTa

随机推荐