问题详情
在一个demo环境中, 发现执行初始化脚本报错, 报错建表语句如下
CREATE TABLE r_topo (
id int(10) NOT NULL AUTO_INCREMENT COMMENT '拓扑id',
name varchar(20) DEFAULT NULL COMMENT '拓扑名称',
portal_id int(10) DEFAULT NULL COMMENT '关联portal的id',
PRIMARY KEY (id),
KEY fkt_portal_id (portal_id),
CONSTRAINT fkt_portal_id FOREIGN KEY (portal_id) REFERENCES t_portal (id) ON DELETE CASCADE
) ENGINE=InnoDB COMMENT='拓扑信息表';
问题定位
网上查找资料发现, 出现该问题可能是由于以下原因引起的:
1. 外键列数据类型与其引用列不一致
2. 外键相关的两张表引擎需要为InnoDB
通过比对, 虽然t_portal表中的id列数据类型为 int(11), 长度不同
但数据类型一致, 说明数据类型比对没有问题
然后查看t_portal表引擎, 其值为MyISAM, 是一种不支持外键操作的引擎
因此需要将t_portal表做引擎变更操作
解决方案
执行如下sql, 问题解决
alter table t_portal engine=innodb;
问题扩展
mysql引擎简介
- MyISAM:这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM,目前都不支持事务,行级锁和外键约束的功能。
- InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
- HEAP(memory):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
- ARCHIVE:非常适合存储大量独立的、作为历史记录的数据。区别于InnoDB和MyISAM这两种引擎,ARCHIVE提供了压缩功能,拥有高效的插入速度,但是这种引擎不支持索引,所以查询性能较差。
- CSV:使用该引擎的MySQL数据库表会生成.CSV文件, 因此它可以将CSV类型的文件当做表进行处理。该存储引擎不支持索引,即该种类型的表没有主键列, 另外也不允许表中的字段为null。
这里demo环境使用MyISAM主要是希望在数据恢复上更为便利, 更多引擎介绍可以跳转查看