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

MySQL:无法创建表(错误号:150),mysql,sql,phpmyadmin,mysql-error-150,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`) O

我正在尝试导入.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;    
我从同一个数据库导出了.sql,删除了所有的表,现在我正试图导入它,为什么失败了

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


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

错误号150表示外键约束失败。您可能是在外键依赖于表关键字的表之前创建此表。首先创建该表,它应该可以正常工作

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

来自:

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


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

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

更改表的引擎,只有innoDB支持外键

可能会有所帮助?主键列的定义应与外键列的定义完全相同。

如果在一个字符集中创建PK表,然后在另一个字符集中创建FK表..那么您也可能会遇到此错误…我也遇到此错误,但在将字符集更改为PK字符集后,执行时没有错误

create table users
(
------------
-------------
)DEFAULT CHARSET=latin1;


create table Emp
(
---------
---------
---------
FOREIGN KEY (userid) REFERENCES users(id) on update cascade on delete cascade)ENGINE=InnoDB, DEFAULT CHARSET=latin1;

确保所有表都能支持外键-InnoDB引擎

我认为所有这些答案都是正确的,但都会误导问题

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

SET FOREIGN_KEY_CHECKS=0;

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

在浏览了上面的答案并进行了一点实验之后,这是解决MySQL 1005-error 150中外键错误的有效方法

为了正确创建外键,MySQL要求的是:

所有引用的键必须具有主索引或唯一索引。 再次引用列必须具有与被引用列相同的数据类型。
满足这些要求,一切都会好起来。

有时候MySQL真是太蠢了——我能理解外键的原因。。但在我的例子中,我刚刚删除了整个数据库,我仍然得到了错误。。。为什么?我是说,已经没有数据库了。。。我使用的sql用户无法访问服务器上的任何其他数据库。。。我的意思是,服务器对于当前用户是空的,我仍然得到这个错误?对不起,我猜MySQL是在骗我。。。但我可以处理它:只需在你那该死的语句周围添加以下两行SQL:

SET FOREIGN_KEY_CHECKS = 0;
# some code that gives you errno: 150
SET FOREIGN_KEY_CHECKS = 1;

现在应该执行sql。。。如果您确实有外键问题,它会在您将再次启用检查的行中向您显示-这将失败。。但是我的服务器很安静:

请确保主键列和引用列的数据类型和属性相同,无符号、二进制、无符号零填充等。

如果两个表都有引用,例如,一个表是学生,另一个表是教育,我们希望Education表具有Student表的外键引用。在本例中,两个表的列数据类型应相同,否则将生成错误。

我在将Windows应用程序移植到Linux时遇到此错误。在Windows中,数据库表名不区分大小写,而在Linux中,它们区分大小写,这可能是因为文件系统不同。因此,在Windows上,表1与表1相同,并且在引用中,表1和表1都起作用。在Linux上,当应用程序在创建数据库结构时使用table1而不是table1时,我看到错误150;当我在表1引用中创建正确的字符大小写时,它也开始在Linux上工作。因此,如果没有其他帮助,请确保在Linux上运行时,在引用中的表名中使用了正确的字符大小写。

您可以通过运行SHOW ENGINE INNODB STATUS获得实际的错误消息;然后在输出中查找最新的外键错误

资料来源:

A RealEdge案例中,您使用了MySQL工具Sequel Pro来重命名数据库。然后创建了一个同名的数据库

这使外键约束保持为相同的数据库名称,因此重命名的数据库(例如my_db_Rename)在新创建的数据库my_db中具有外键约束


不确定这是否是Sequel Pro中的一个bug,或者某些用例是否需要这种行为,但这花费了我大部分时间://

从子表中引用的父表列必须是唯一的。如果不是,则导致第150个错误。

我也有同样的错误。在我的例子中,出现错误的原因是我在约束中有一个ON DELETE SET NULL语句,而我在其定义中放置约束的字段有一个NOT NULL语句。在字段中允许NULL解决了这个问题。

有很多事情会导致errno 150,因此对于搜索此主题的人,我认为这是一个近乎详尽的列表来源:

对于errno 150或errno 121,只需输入SHOW ENGINE INNODB STATUS,就会有一个名为LATEST FOREIGN KEY ERROR的部分。在这种情况下,它会给你一个非常有用的错误消息,通常会立即告诉你是怎么回事。您需要超级权限来运行它,因此如果您没有,您只需测试以下场景

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

2个父列未索引或索引顺序错误

3列排序规则不匹配

4在NOT NULL列上使用SET NULL

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

6父表中实际上不存在父列。检查拼写,可能在列的开头或结尾处留一个空格

7其中一列上的某个索引不完整,或者该列太长,无法创建完整的索引。请注意,除非调整MySQL,否则它的最大单列键长度为767字节,这对应于varchar255 UTF列

如果您遇到错误121,以下是几个原因:

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


2在某些系统上,如果语句和表名存在大小写差异。如果您从一台服务器转到另一台具有不同案例处理规则的服务器,这可能会对您造成影响。

在大多数情况下,问题是由于引擎的差异。如果父服务器是由InnoDB创建的,则引用的表应该由MyISAM创建,反之亦然。

我在转储Django mysql数据库时遇到类似的问题只有一张桌子。我能够通过将数据库转储到文本文件、使用emacs将有问题的表移动到文件末尾并将修改后的sql转储文件导入到新实例中来解决这个问题


在我的情况下,我们是。我的主机服务器更改了设置,新表是MyISAM,而旧表是InnoDB,所以引擎和字符集出现了问题。只是我改变了。

我在从文本文件创建DB时遇到了这种问题

mysql -uroot -padmin < E:\important\sampdb\createdb.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\insert_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\insert_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\load_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\load_absence.sql 
我只是在Create.bat中写了上面几行,然后运行bat文件

我的错误在于sql文件中的执行顺序。我尝试用主键和外键创建表。当它运行时,它将搜索引用表,但表不在那里。 因此它将返回此类错误

如果使用外键创建表,请检查引用 有没有桌子。并检查引用的名称 表和字段


我已经通过使变量accept null来纠正这个问题


我有一个类似的问题,但我的问题是因为我正在将一个新字段添加到一个包含数据的现有表中,而新字段正在引用父表中的另一个字段,并且定义为NOTNULL且没有任何默认值。-我发现事情不顺利的原因是

在应用约束之前,我的新字段需要从每个记录的父表中自动填充空白字段。每次应用约束时,都需要保持表数据的完整性不变。实现约束外键,但有些数据库记录没有父表中的值,这意味着数据已损坏,因此MySQL永远不会强制执行约束 请务必记住,在正常情况下,如果提前规划数据库,并在插入数据之前实施约束,则可以避免这种特殊情况

避免这种情况的更简单方法是

保存数据库表数据 截断表数据和表工件,即索引等 应用约束 导入数据
我希望这对某人有所帮助

我在执行一系列MySQL命令时遇到了同样的问题。当r 将外键引用到尚未创建的其他表。这是表在引用之前的存在顺序


解决方案:先创建父表,然后再创建具有外键的子表。

创建不带外键的表,然后分别设置外键

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


外键必须具有与主键相同的数据类型。另外,如果主键没有签名,那么外键也必须没有签名。

我也有同样的问题。它和表的列排序规则和字符集有关。 确保两个表上的两列的字符集和排序规则必须相同。如果你想在上面设置外键。

示例-如果将外键放在userImage表的userID列上,并引用users表的userID列,则两列表的排序规则必须相同,即utf8\U general\U ci和字符集utf8。通常,当您创建表时,mysql从服务器设置中获取这两种配置。

一个表中的两列是否可以引用另一个表中的一列,PK在哪里?@Eugene:这两列中的每一列都可以与另一个表中的PK具有外键关系-而不是作为单个外键关系的两列。@OMGPonies:感谢您回答这个问题!。。我在寻找它…我在这里也问了一个问题…虽然我有一些很好的答案,但我想确认是否有可能为我的问题编写嵌套查询。。我想请你也回答我!我的错误是主表有MyISAM和子表InnoDB引擎。当前的create.sql脚本对所有表都使用InnoDB,但我有一个非常非常旧的安装,第一个脚本使用MyISAM。@Whome-Yep,在这里遇到了相同的问题。对于导致此错误的所有原因,下面是一个详尽的资源,介绍MySQL中导致errno 150和errno 121/其他外键错误的原因。我发现,即使unsigned标志必须匹配,列也必须相同。@JohnSmith。。。在哪里?我建议阅读这篇博客文章,列出10个可能的原因:@CharlesWood:。。。4月6日13日19:29,距离你的评论还有三个月左右。我有一种恐惧,在这个沉闷的世界结束之前,哪里的神秘不会被揭开!:>谢谢:对我来说,数据类型是INT,但一个是unsigned,而另一个不是。在使用模式生成器时,我经常遇到BIGINT vs INT。当外键不是INT值时,我也遇到了同样的问题。当外键引用该列时,该列必须是唯一的。如果引用的列上没有索引,则会出现相同的错误,并且引用的列必须根据首先出现在索引中。感谢排序规则位。这实际上非常有用。它告诉你确切的错误。谢谢。很遗憾MySQL工作台没有利用它。太棒了。这很有帮助。告诉你确切的错误。我的是,使列可以为null,但在delete上设置为null。非常感谢。如果你在你的服务器上有特权:谢谢-这是我的问题。这是我的问题。感谢如果您使用mysqldump创建innodb表的sql文件,并将其导出为myisam talbes,则可能会发生这种情况。您可能需要添加更详细的信息,例如特定的列和表名称。如果列和它引用的列之间存在实际差异,则可能会导致问题。例如。假设引用的列是varchar200,引用者是varchar50,那么当尝试级联时,可能会出现奇怪的行为。我没有遇到过因为数据不匹配而发出errno 150的问题。有趣的是@juacala@juacla:有趣的是,每当我遇到这个问题时,我的方法总是能解决它。。。至少直到今天:D但我们从不停止学习,对吧;这实际上帮助我生成了一个脚本liquibase。该脚本在MySQL>5.5上完美运行,但在版本5.1中失败。在某些版本中,如果表不是innodb,您会收到错误号150,但在某些版本中,它只是默默地失败。谢谢,这很好:|--------------------最新的外键错误|----------您定义了一个SET NULL条件,尽管有些列被定义为NOT NULL。这对我来说是正确的,因为我正在更改一个不是我自己创建的数据库。这也是我的情况!将脚本从不区分大小写的OS X移动到区分大小写的mysql版本Debian。为什么我以前没有看到这个poist!?我花了一个小时找出根本原因。这就是我的情况。引用表和引用表必须具有相同的字符集。这样做对我不起作用,仍然会产生错误。有什么想法吗?换句话说,您试图创建一个外键指向另一个尚不存在的表的表。按照正确的顺序创建表以解决问题。
ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR( 2 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL