MySQL:无法创建表(错误号:150)

gti*_*ilx 152 mysql sql phpmyadmin mysql-error-150

我试图导入.sql文件,并在创建表时失败.

这是失败的查询:

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;    
Run Code Online (Sandbox Code Playgroud)

我从同一个数据库导出.sql,我删除了所有的表,现在我试图导入它,为什么它失败了?

MySQL:无法创建表'./dbname/data.frm'(错误号:150)

OMG*_*ies 163

MySQL - FOREIGN KEY约束文档:

如果重新创建已删除的表,则它必须具有符合引用它的外键约束的定义.它必须具有正确的列名和类型,并且必须在引用的键上具有索引,如前所述.如果不满足这些,MySQL将返回错误1005并在错误消息中引用错误150,这意味着未正确形成外键约束.类似地,如果ALTER TABLE由于错误150而失败,则意味着对于更改的表将错误地形成外键定义.

  • 我的错误是主表有MyISAM和子表InnoDB引擎.当前的create.sql脚本正在为所有表使用InnoDB,但我的安装非常旧,第一个脚本使用了MyISAM. (18认同)
  • @Whome-是的,在这里遇到了同样的问题。 (2认同)

Dan*_*ath 97

错误150表示您的外键有问题.可能外表上的键不是完全相同的类型?

  • 谢谢:)对我来说,数据类型是INT但是一个未签名而另一个不是 (15认同)
  • 在使用模式生成器时,我经常遇到`BIGINT` v​​s`INT`. (5认同)

Den*_*aia 61

您可以通过运行SHOW ENGINE INNODB STATUS;然后LATEST FOREIGN KEY ERROR在输出中查找来获取实际的错误消息.

来源:在类似问题中来自其他用户的回答

  • 这实际上非常有用.它告诉你确切的错误. (7认同)

Esb*_*sen 29

数据类型必须完全匹配.如果要处理varchar类型,则表必须使用相同的排序规则.

  • 谢谢你的整理位. (4认同)

小智 24

我认为正确的所有这些答案都会误导这个问题.

如果要使用外键还原转储文件,则在开始还原之前,实际答案是:

SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

因为在外表甚至存在之前,恢复自然会创建一些约束.


pi.*_*pi. 22

在某些情况下,如果相关表之间存在不同的引擎,则可能会遇到此错误消息.例如,表可能正在使用InnoDB而另一个表使用MyISAM.两者都需要相同


Era*_*rin 11

错误号码 150表示外键约束失败.您可能在外键所依赖的表(表keywords)之前创建此表.首先创建该表,它应该工作正常.

如果没有,删除外键语句并在创建表后添加它 - 您将获得有关特定约束失败的更有意义的错误消息.


jua*_*ala 10

有很多事情可以导致errno 150,所以对于搜索这个主题的人来说,这就是我认为接近详尽的列表(Errno 150的来源):

对于errno 150或errno 121,只需键入SHOW ENGINE INNODB STATUS,就会出现一个名为"LATEST FOREIGN KEY ERROR"的部分.在此之下它会给你一个非常有用的错误信息,通常会立即告诉你什么是问题.您需要SUPER权限才能运行它,因此如果您没有,则只需测试以下方案即可.

1)数据类型不匹配:列的类型必须相同

2)没有索引的父列(或以错误的顺序索引)

3)列排序不匹配

4)在NOT NULL列上使用SET NULL

5)表排序不匹配:即使列排序匹配,在某些MySQL版本上这可能是个问题.

6)父列在父表中实际上不存在.检查拼写(也许是列的开头或结尾处的空格)

7)其中一列的索引之一是不完整的,或者列对于完整索引而言太长.请注意,MySQL(除非您调整它)的最大单列密钥长度为767字节(这对应于varchar(255)UTF列)

如果你得到一个errno 121,这里有几个原因:

1)您选择的约束名称已被采用

2)在某些系统上,如果语句和表名中存在大小写差异.如果您从一台服务器转到另一台具有不同案例处理规则的服务器,这可能会让您感到困惑.


jeb*_*bie 8

有时MySQL只是超级愚蠢 - 我可以理解外键的原因..但在我的情况下,我刚刚删除整个数据库,我仍然得到错误...为什么?我的意思是,没有数据库了......我正在使用的sql-user无法访问服务器上的任何其他数据库...我的意思是,服务器对于当前用户来说是"空的"而且我仍然得到这个错误?抱歉,我想MySQL对我说谎......但我可以处理它:)只需在你的fucky语句中添加这两行SQL:

SET FOREIGN_KEY_CHECKS = 0;
# some code that gives you errno: 150
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)

现在应该执行sql ...如果你真的有一个外键问题,它将显示你将再次启用检查的行 - 这将失败然后..但我的服务器只是安静:)


Rak*_*esh 5

通常,外键和主键不匹配会导致错误:150。

必须与主键具有相同的数据类型。此外,如果主键无符号的,那么外键也必须是无符号的


小智 5

我有同样的问题。它与表的列Collat​​ionCharacter Set 相关。确保两个表上的两列的字符集排序规则必须相同。如果你想设置一个外键。示例 - 如果您将外键放在 userImage 表的 userID 列上,引用 users 表的 userID 列。那么对于表的两列,排序规则必须相同,即utf8_general_ci和字符集utf8。通常,当您创建表时,mysql 从服务器设置中获取这两个配置。