如何建立两个表间的外键
建立Mysql两个表间的外键,需要满足三个条件
- 两个表必须是InnoDB表类型
- 使用在外键关系的域必须为索引型(Index)
- 使用在外键关系的域必须与数据类型相似
下面举例说明
我们创建一个班级表和一个学生表,并建立一个外键
创建班级表
CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB;
插入班级数据
INSERT INTO class VALUES (1,"一班"),(2,"二班"),(3,"三班");
创建学生表
CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, INDEX (FK_class), FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id)) ENGINE=INNODB;
验证外键约束性,我们向students表插入一个学生数据,并让FK_class的值为一个在class表里面不存在的值.
mysql> INSERT INTO students VALUES (1,"zhang",5);
马上就会看到Mysql报错
ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails (`test/students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`FK_class`) REFERENCES `class` (`id`))
以上证明外键可以正常工作了
在Mysql下测试了以下,不建立index,并且不指定innodb格式. 版本
+———————-+ | version() | +———————-+ | 5.0.24a-community-nt | +———————-+
建立class表
CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id));
建立students表
CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id));
通过Navicat查看,上面语句建立的两个表,也会默认用INNODB存储,而且也在students表建立了index和外键.一切正常.