在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: 在串联方式下,在父表上的操作将会同步到子表上.
- student表中存在与父表的对应,也可以 delete/update 父表class中的记录. 此时子表中的记录同样被 delete/update.
- 这里要注意,父表中的外键字段被delete,子表这条记录所有字段都将被delete. 而update只会更改对应的字段.
set null:在父表上update/delete记录时,将子表上匹配记录的列设为null,要注意子表的外键列不能为not null
- student表中存在与父表的对应,也可以 delete/update 父表class中的记录. 此时子表中的记录同样被 delete/update.
- 区别与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不能识别