将 FOREIGN KEY 添加到 MySQL table 时出现错误 150
Error 150 when adding FOREIGN KEY to MySQL table
我不确定为什么我总是遇到外键问题,但我又遇到了。
当我运行:
ALTER TABLE wishlist ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user (user_id);
我得到:
Can't create table (errno: 150)
两个table都存在。两列都存在,并且它们都是同一类型 - bigint(20)。 user.user_id 是主键,但 wishlist.user_id 不是。两者都是NOT NULL
这里是用户table的开头(为了方便阅读,我整理了运行):
+-----------------+------------------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------------------+------+-----+-------------------+----------------+
| user_id | bigint(20) | NO | PRI | NULL | auto_increment |
| salt2 | varchar(24) | YES | | NULL | |
| gender | enum('MAN','WOMAN','EITHER') | NO | | NULL | |
| user_name | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| user_email | varchar(255) | NO | | NULL | |
| phone | varchar(20) | NO | | NULL | |
和 wishlist
table:
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| wish_id | int(11) | NO | PRI | NULL | auto_increment |
| link_hash | char(32) | YES | MUL | NULL | |
| user_id | bigint(20) | NO | | NULL | |
+-----------+------------+------+-----+---------+----------------+
我不是在创建一个被删除的 table。
如果您使用的是 InnoDB,user_id 列必须是 "key" 或 "primary key" 类型,而不是 bigint 类型。该特定引擎不喜欢在非关键项目上创建 FK 约束。
CREATE TABLE 'user' (
KEY 'user_id' ('user_id')
[... your columns here]
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此外,确保两者使用相同的引擎和字符集,否则仍然会失败。
我不确定为什么我总是遇到外键问题,但我又遇到了。
当我运行:
ALTER TABLE wishlist ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user (user_id);
我得到:
Can't create table (errno: 150)
两个table都存在。两列都存在,并且它们都是同一类型 - bigint(20)。 user.user_id 是主键,但 wishlist.user_id 不是。两者都是NOT NULL
这里是用户table的开头(为了方便阅读,我整理了运行):
+-----------------+------------------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------------------+------+-----+-------------------+----------------+
| user_id | bigint(20) | NO | PRI | NULL | auto_increment |
| salt2 | varchar(24) | YES | | NULL | |
| gender | enum('MAN','WOMAN','EITHER') | NO | | NULL | |
| user_name | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| user_email | varchar(255) | NO | | NULL | |
| phone | varchar(20) | NO | | NULL | |
和 wishlist
table:
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| wish_id | int(11) | NO | PRI | NULL | auto_increment |
| link_hash | char(32) | YES | MUL | NULL | |
| user_id | bigint(20) | NO | | NULL | |
+-----------+------------+------+-----+---------+----------------+
我不是在创建一个被删除的 table。
如果您使用的是 InnoDB,user_id 列必须是 "key" 或 "primary key" 类型,而不是 bigint 类型。该特定引擎不喜欢在非关键项目上创建 FK 约束。
CREATE TABLE 'user' (
KEY 'user_id' ('user_id')
[... your columns here]
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此外,确保两者使用相同的引擎和字符集,否则仍然会失败。