将 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;

此外,确保两者使用相同的引擎和字符集,否则仍然会失败。