【问题标题】:MySQL query works on backup DB but not on original where it fails with errno: 150MySQL 查询适用于备份数据库,但不适用于原始数据库,它因错误而失败:150
【发布时间】:2018-08-14 23:13:18
【问题描述】:

我在我的机器 (OS X 10.13.6) 上导入我的 MySQL 数据库的备份并运行此脚本:

ALTER TABLE user_activity_data
ADD FOREIGN KEY (article_id) REFERENCES Article(id);

一切正常:添加了外键。

我在原始机器(Debian GNU/Linux 8 (jessie))上运行相同的脚本,但脚本失败并显示错误消息:

errno: 150

两列的类型完全相同:int(11)

这怎么可能?这是一个备份,所以它是同一个数据库。确实,这是两个不同版本的 MySQL……但它们显然应该是兼容的。


这是脚本失败的 MySQL 版本:

+-----------------+
| 5.5.60-0+deb8u1 |
+-----------------+

以及它成功的版本:

+-----------+
| 5.7.22    |
+-----------+

【问题讨论】:

  • 它们都可以是 int(11) 如果一个是“无符号”那么它们是不同的类型。检查两列是否已签名/未签名。
  • 两者都没有签名。谢谢!

标签: mysql


【解决方案1】:

您可能需要确保您的外键与主键具有完全相同的类型。

MySQL 5.5 可能更宽容一些,而 MySQL 5.7 则更严格一些。考虑在两者上使用相同的版本。

【讨论】:

  • 我赞成您的回答,因为在我的问题中澄清两列的类型完全相同是很有用的。但这并不能解决问题。
【解决方案2】:

呃!找到了,但是很讨厌:(

看来,

  • 在 Debian 上,表名区分大小写,而在 OS X 上则不区分。

因此问题在于REFERENCES 子句的对象应该是article(id) 而不是Article(id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多