Mysql外键错误150

标签 mysql foreign-keys

我是一名 mysql 初学者,目前正在研究外键。 我想创建三个表:用户、商品、订单并将它们链接在一起

用户表:

CREATE TABLE users (
user_id INT(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
PRIMARY KEY(user_id)
);

项目表:

CREATE TABLE items (
item_id INT(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
PRIMARY KEY(item_id)
);

订单表:

CREATE TABLE orders (
order_id INT(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
item_id INT,
quantity INT(10) NOT NULL,
user_id INT,
PRIMARY KEY (order_id),
FOREIGN KEY (item_id) REFERENCES items (item_id),
FOREIGN KEY (user_id) REFERENCES users (user_id)
);

但我收到错误 1005:无法创建表 'new.orders'(错误:150)

我的代码有什么问题?

谢谢!

最佳答案

主表列和引用表列的数据类型必须完全匹配。在您的定义中,items.item_idINT UNSIGNED,而外键 orders.item_idINT(隐式签名)。 user_id 也是如此。

如下更改定义,为这两个添加UNSIGNED:

CREATE TABLE orders (
  order_id INT(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
  item_id INT UNSIGNED,
  quantity INT(10) NOT NULL,
  user_id INT UNSIGNED,
  PRIMARY KEY (order_id),
  FOREIGN KEY (item_id) REFERENCES items (item_id),
  FOREIGN KEY (user_id) REFERENCES users (user_id)
);

然后它会正确构建:http://sqlfiddle.com/#!2/cfab8

关于Mysql外键错误150,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180534/

相关文章:

mysql - 日期比较不起作用(日期是字符串)-MySQL

php - 如何将 mysql UPDATE 限制为仅在 for 循环中处理的行?

mysql - SQL语句操作优先级

php - 删除主键时删除所有外键数据,反之亦然

php - 在 php foreach 循环中从 mysql 获取数据的有效方法

mysql - PERL - DBD::mysql::st 执行失败:MySQL 客户端内存不足

mysql - 具有复合主键约束的多对多关系

mysql - 将外键替换为链接表中的值

mysql - 向具有外键约束的表添加行 [MySQL]

php - 具有 1 对 1 关系的 SQL 删除