mysql异常 [Err] 1215 - Cannot add foreign key constraint

问题详情

在一个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引擎简介


  1. MyISAM:这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM,目前都不支持事务,行级锁和外键约束的功能。
  2. InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
  3. HEAP(memory):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
  4. ARCHIVE:非常适合存储大量独立的、作为历史记录的数据。区别于InnoDB和MyISAM这两种引擎,ARCHIVE提供了压缩功能,拥有高效的插入速度,但是这种引擎不支持索引,所以查询性能较差。
  5. CSV:使用该引擎的MySQL数据库表会生成.CSV文件, 因此它可以将CSV类型的文件当做表进行处理。该存储引擎不支持索引,即该种类型的表没有主键列, 另外也不允许表中的字段为null。

这里demo环境使用MyISAM主要是希望在数据恢复上更为便利, 更多引擎介绍可以跳转查看

猜你喜欢

转载自blog.csdn.net/bkk854762363/article/details/78435823
今日推荐