今天将sqlite的表迁移到mysql中,有一张表的存在外键。外键约束的成立条件首先就是子表(定义外键的表)的引用的父表的那一列有唯一性约束,也就是UNIQUE,当一列是主键(PRIMARY KEY )他已经是默认的唯一性,所以可以不用考虑这个问题。另外还需要注意的问题如下:
找不到父表中引用的列
主键和外键的字符编码不一致
外键字段与要做外键校验的字段类型不匹配
MySQL支持外键约束,并提供与其它DB相同的功能,但表类型必须为 InnoDB,非InnoDB 存储引擎会导致报错
多个子表的外键引用同一个父表的列时,每个外键的名称不能一样
外键的用法一般作为一种关联性校验,如下:
父表更新时子表也更新,父表删除时如果子表有匹配的项删除失败 (ON UPDATE CASCADE ON DELETE RESTRICT)
父表更新时子表也更新,父表删除时子表匹配的项也删除(ON UPDATE CASCADE ON DELETE CASCADE)
下面给出一个简单的例子分别创建父表和子表。
父表sql语句:
1 2 3 4 5 6 7
| CREATE TABLE `线路表` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `线路名` varchar(255) DEFAULT NULL, `属性` varchar(255) DEFAULT NULL, `统计` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
子表sql语句:
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE TABLE `节点表` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `线路ID` int(11) NOT NULL, `节点名` varchar(255) DEFAULT NULL, `属性` varchar(255) DEFAULT NULL, `位置` varchar(255) DEFAULT NULL, `版本` varchar(255) DEFAULT NULL, `设置` varchar(255) DEFAULT NULL, `统计` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`), KEY `FK` (`线路ID`), CONSTRAINT `FK` FOREIGN KEY (`线路ID`) REFERENCES `线路表` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8
|