You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助解决MySQL errno:150「外键约束格式不正确」建表错误

解决外键约束错误(errno: 150)的问题

Hey,我看到你被这个外键创建错误卡住了——Can't create table 'savs_db'.'votes' (errno: 150 "Foreign key constraint is incorrectly formed"),虽然你已经检查了字段类型、引擎和字符集,但还有一个关键细节容易被忽略:InnoDB要求外键关联的父表字段必须是唯一键(UNIQUE)或者主键(PRIMARY KEY)

看你的users表结构,sa_id只是标记了NOT NULL,但并没有设置唯一约束。这就导致数据库无法保证votes表中的sa_id能对应到users表中唯一的一条记录,所以外键约束无法创建。

具体修复方案:

你有两种方式解决这个问题:

方式一:修改已存在的users

如果users表已经创建好了,执行这条语句给sa_id添加唯一索引:

ALTER TABLE users ADD UNIQUE INDEX idx_sa_id (sa_id);

方式二:重新创建users表时直接添加约束

如果还没往users表里插入数据,也可以直接在创建表的时候给sa_id加上UNIQUE属性:

CREATE TABLE users (
 id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 sa_id VARCHAR(30) NOT NULL UNIQUE, -- 新增UNIQUE约束
 name VARCHAR(30) NOT NULL,
 surname VARCHAR(30) NOT NULL,
 address1 VARCHAR(70),
 address2 VARCHAR(70) NOT NULL,
 suburb VARCHAR(50) NOT NULL,
 city VARCHAR(30) NOT NULL,
 province VARCHAR(30) NOT NULL,
 zip INT(6) NOT NULL,
 email VARCHAR(70) NOT NULL,
 password CHAR(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

完成上面的操作后,再执行你原来的votes表建表语句,外键约束就能正常生效了。

再确认下你已经做对的地方:

  • 两张表的sa_id字段都是VARCHAR(30) NOT NULL,数据类型和长度完全匹配,没问题。
  • 两张表都使用InnoDB引擎,满足外键的引擎要求。
  • 字符集都是utf8,不会因为字符集不兼容导致约束失败。

内容的提问来源于stack exchange,提问作者user12066439

火山引擎 最新活动