zoukankan      html  css  js  c++  java
  • mysql--外键(froeign key)-----------MySQL外键使用详解

    如果一个实体的某个字段指向另一个实体的主键,就称为外键
    被指向的实体,称之为主实体(主表),也叫父实体(父表)。
    负责指向的实体,称之为从实体(从表),也叫子实体(子表)

     

    作用:
    用于约束处于关系内的实体
    增加子表记录时,是否有与之对应的父表记录

    如果主表没有相关的记录,从表不能插入

     

    先插入主表数据后再插入从表数据:

     

    在删除或者更新主表记录时,从表应该如何处理相关的记录

    设置级联操作:
    在主表数据发生改变时,与之关联的从表数据应该如何处理
        使用关键字:
         on update
         on delete
        来标识
    允许的级联动作:
    cascade关联操作,如果主表被更新或删除,从表也会执行相应的操作
    set null,表示从表数据不指向主表任何记录
    restrict:拒绝主表的相关操作

    alter table t_student add foreign key (class_id) references t_class (class_id)
    on delete set null; # 在删除外键时,将从表的外键值设置为null


    修改外键:
    先删除这个表的外键,然后再增加
    alter table tb_name drop froeign key 外键名称
    外键名称在建立外键时可以自定义名称,如果不自定义,会按照mysql自动生成一个名称
    show create table tb_name;
     

    alter table t_student drop foreign key t_student_ibfk_1;


     

    删除外键后不会对表中的数据造成任何影响,改变的只是对表的一种约束

    alter table t_student add foreign key (class_id) references t_class (class_id)
    on delete set null; # 在删除外键时,将从表的外键值设置为null

     

     

    注:on delete 与on update 可以同时出现,
     但在on delete 或on update 后不能同时出现cascade、set null、restrict,只能有一个
    关于restrict的外键约束此处没有写,与其他两个一样
     restrict:拒绝主表的相关操作,在主表更新或者删除数据时,在从表中存在与主表主键相关的数据,则不允许对主表数据进行更新或者删除

    在不设置任何级联关系约束时,主表默认会是restrict

     


    在restrict约束下,如果想要删除主表数据,除了可以删除没有与子表数据相关的数据外,
    可以先修改子表中的外键(修改时,外键必须也要关联到主表的主键,否则不能修改成功)
     

    也可以先删除与想要删除的主表数据的子表数据,再去删除此条主表数据

     

    原网址:http://www.cnblogs.com/zunpeng/p/3878459.html

    最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键。

    (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持外键约束

    (2)外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

    (3)外键的作用:

    保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

    (4)建立外键的前提:

    两个表必须是InnoDB表类型。
    使用在外键关系的域必须为索引型(Index)。
    使用在外键关系的域必须与数据类型相似

    (5)创建的步骤

    指定主键关键字: foreign key(列名)

    引用外键关键字: references <外键表名>(外键列名)

    (6)事件触发限制:on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

    (7)举例

    outTable表 主键 id 类型 int

    创建含有外键的表:

    复制代码 代码如下:

    create table temp(
    id int,
    name char(20),
    foreign key(id) references outTable(id) on delete cascade on update cascade);

    说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。

    复制代码 代码如下:

    create table temp( id int, name char(20), foreign key(id) references outTable(id) on delete cascade on update cascade);

    缺点:在对MySQL做优化的时候类似查询缓存,索引缓存之类的优化对InnoDB类型的表是不起作用的,还有在数据库整体架构中用得同步复制也是对InnoDB类型的表不生效的,像数据库中核心的表类似商品表请大家尽量不要是使用外键,如果同步肯定要同步商品库的,加上了外键也就没法通不了,优化也对它没作用,岂不得不偿失,做外键的目的在于保证数据完整性,请大家通过程序来实现这个目的而不是外键,切记!

    原网址:http://www.jb51.net/article/62971.htm

  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/jianmingyuan/p/6741798.html
Copyright © 2011-2022 走看看