[Err] 1005 - Can't create table 'xx' (errno: 150) 解决方案

转载别人的博客:

https://blog.csdn.net/yangzaiqiu1986814/article/details/17009601

具体内容如下:

MySQL错误号1005
[错误] 1005 - 无法创建表'blog_db。#sql-136c_4'(错误号:150)

如果在尝试创建外键时出现此错误,则可能非常令人沮丧。关于无法创建.frm文件的错误似乎是某种操作系统文件权限错误或其他什么,但事实并非如此。这个错误已被报告为MySQL开发人员列表中的一个错误,但它实际上只是一个误导性的错误消息。

在每种情况下,这都归因于MySQL不喜欢的关系。不幸的是,它没有具体说明具体问题。以下是人们为可怕的errno 150报告的原因的运行列表。我试图根据我听到的特定原因的频率将它们整理好。

您可能希望在收到错误后立即运行MySQL命令“ SHOW INNODB STATUS ”。此命令显示日志信息和错误详细信息。(感谢Jonathan提示)

注意:如果您的脚本在一台服务器上运行正常,但在尝试在另一台服务器上运行时出错,则很可能#6是问题所在。不同版本的MySQL具有不同的默认字符集设置。

已知原因:

两个关键字  段类型  和/或  大小 不完全匹配。例如,如果一个是INT(10),则关键字段也需要是INT(10)而不是INT(11)或TINYINT。您可能希望使用SHOW CREATE TABLE确认字段大小,因为查询浏览器有时会直观地显示INT(1)和INT(11)的INTEGER。你还应该检查  一个是不是SIGNED而另一个是UNSIGNED(我就是这里出错的,被引用表的字段为unsigned,而引用表中为签名)。它们都需要完全相同。(关于签名vs未签名的更多信息)。
您尝试引用的关键字段之一没有 索引  和/或不是  主键。如果关系中的某个字段不是主键,则必须为该字段创建索引。(感谢Venkatesh和Erichero以及Terminally Incoherent的提示)
外键名称是 已存在键的  副本。检查外键的名称在数据库中是否唯一。只需在密钥名称的末尾添加一些随机字符即可对其进行测试。(感谢Niels的提示)
您的一个或两个表是 MyISAM表。为了使用外键,表必须都是InnoDB。(实际上,如果两个表都是MyISAM,那么您将不会收到错误消息 - 它只是不会创建密钥。)在查询浏览器中,您可以指定表类型。
您已指定级联  ON DELETE SET NULL,但相关键字段设置为NOT NULL。您可以通过更改级联或将字段设置为允许NULL值来解决此问题。(感谢Sammy和J Jammin)
确保Charset和Collat​​e选项在表级别以及关键列的单个字段级别相同。(感谢FRR提示)
您的外键列上有一个默认值(即默认值= 0)(感谢Omar的提示)
关系中的一个字段是组合(复合)键的一部分,并没有它自己的单独索引。即使该字段具有索引作为复合键的一部分,您也必须仅为该键字段创建单独的索引,以便在约束中使用它。(感谢Alex提供的这个提示)
您在ALTER语句中有语法错误,或者您在关系中输错了一个字段名称(感谢Christian&Mateo的提示)
外键的名称超过64个字符的最大长度。(感谢Nyleta提示)
————————————————————————————————————————————————————————————————————————————
1.两个表的字段的类型必须一致
--------------------- 
作者:yangzaiqiu1986814 
来源:CSDN 
原文:https://blog.csdn.net/yangzaiqiu1986814/article/details/17009601 
版权声明:本文为博主原创文章,转载请附上博文链接!

根据这位博主写的提示,找到我的错误,两个表类型必须是nnoDB,我的表有一个是 MyISAM表,导致表报错。

猜你喜欢

转载自blog.csdn.net/qq_40619468/article/details/83979205