MySQL创建report表报错errno:150 外键约束格式错误原因排查
report表时会触发外键约束错误(errno:150)? 这个错误我太熟了——MySQL的errno 150本质就是外键约束的定义不符合规则,我帮你拆解几个最常见的原因:
关联列的数据类型/属性完全不匹配
外键列和它要关联的patient_info表的主键列必须是完全一致的类型,包括数据类型、长度、是否无符号这些细节。比如如果patient_info的主键是INT UNSIGNED,但report里的外键列写成了INT(没有UNSIGNED),或者主键是VARCHAR(20),外键列是VARCHAR(30),都会触发这个错误。关联的列不是主键或唯一约束
外键必须指向另一张表的PRIMARY KEY或者带有UNIQUE约束的列,不能是普通的非唯一列。比如你如果把report的外键关联到patient_info的一个普通列(没有加主键或唯一约束),MySQL会直接拒绝创建外键。两张表的字符集/排序规则不一致
如果patient_info和report的字符集或者排序规则不一样(比如一张用utf8mb4_general_ci,另一张用utf8_general_ci),即使列类型匹配,外键约束也会创建失败。MySQL要求关联表的字符集和排序规则必须一致。关联的表名/列名拼写错误
别小看这个低级错误!如果在report的外键定义里,把patient_info写成了patientinfo,或者把主键列名patient_id写成了patientid,MySQL找不到对应的表或列,也会抛出这个错误。使用了不支持外键的存储引擎
只有InnoDB引擎支持外键约束,如果你的report表用了MyISAM或者MEMORY这类不支持外键的引擎,创建外键时肯定会失败。现在MySQL默认是InnoDB,但如果手动指定了其他引擎,就会出问题。
内容的提问来源于stack exchange,提问作者Chathura Yapa

