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不能识别
原文地址:https://www.cnblogs.com/0xcafedaddy/p/7080338.html