zoukankan      html  css  js  c++  java
  • MySql外键

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


    #### class 班级信息表: ``` CREATE TABLE `c` ( `id` int(11) NOT NULL, `cname` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ```

    student 学生信息表:

    CREATE TABLE `s` (
      `id` int(11) NOT NULL,
      `cid` int(11) DEFAULT NULL,
      `sname` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `c_fk` (`cid`),
      CONSTRAINT `c_fk` FOREIGN KEY (`cid`) REFERENCES `c` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    添加外键:

    ALTER TABLE `studen` ADD CONSTRAINT `id_fk` FOREIGN KEY (`id`) REFERENCES `class` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
    

    ### 总结: #### restrict,No action: 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 1. 如果student表中存在cid与class表中的id对应,那么无法delete或者update父表(class)中的此条记录的候选键的值. 2. 在student表中删除没有限制,如果s表中没有cid与c表中关联,那么可以删除c表中的此条记录.

    cascade: 在串联方式下,在父表上的操作将会同步到子表上.

    1. student表中存在与父表的对应,也可以 delete/update 父表class中的记录. 此时子表中的记录同样被 delete/update.
    2. 这里要注意,父表中的外键字段被delete,子表这条记录所有字段都将被delete. 而update只会更改对应的字段.

    set null:在父表上update/delete记录时,将子表上匹配记录的列设为null,要注意子表的外键列不能为not null

    1. student表中存在与父表的对应,也可以 delete/update 父表class中的记录. 此时子表中的记录同样被 delete/update.
    2. 区别与cascade方式,父表中的外键字段被 update/delete,此时子表的外键值将会被设置为null.同时需要注意子表的外键列不能为not null

    参考:
    http://blog.sina.com.cn/s/blog_91339bff0100ymc2.html

    . cascade方式
    在父表上update/delete记录时,同步update/delete掉子表的匹配记录 
    
       . set null方式
    在父表上update/delete记录时,将子表上匹配记录的列设为null
    要注意子表的外键列不能为not null  
    
       . No action方式
    如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作  
    
       . Restrict方式
    同no action, 都是立即检查外键约束
    
       . Set default方式
    父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别
    
  • 相关阅读:
    常见数据结构和算法 的可视化
    JSON与XML
    JavaScript 中的陷阱
    C++ primer(十三)--类继承、构造函数成员初始化、虚函数、抽象基类
    mongodb学习(二)
    再谈怎样以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式
    LaTeX Subfigure 中间加入垂直线
    JAVA基础针对自己薄弱环节总结02(循环)
    软考之路--用文字记录这个漂亮的进程
    mysql异常Lock wait timeout exceeded; try restarting transaction
  • 原文地址:https://www.cnblogs.com/0xcafedaddy/p/7080338.html
Copyright © 2011-2022 走看看