2010-10-31 106 views
135

我想导入一个.sql文件及其在创建表时失败。MySQL:无法创建表(错误:150)

这里是一个失败的查询:

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: Can't create table './dbname/data.frm' (errno: 150)

+19

我发现,列必须是相同的(甚至是无符号标志必须匹配)。 – 2012-12-19 19:54:14

+1

对于这个错误的基本所有原因,下面是在MySQL中导致errno 150(和errno 121 /其他外键错误)的详尽资源。 – 2012-09-29 00:47:12

+3

@JohnSmith ...哪里? – 2013-07-29 17:07:23

回答

148

MySQL - FOREIGN KEY Constraints Documentation

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the correct column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns Error 1005 and refers to Error 150 in the error message, which means that a foreign key constraint was not correctly formed. Similarly, if an ALTER TABLE fails due to Error 150, this means that a foreign key definition would be incorrectly formed for the altered table.

+1

一个表格中的两列可以引用另一个表格中的一列,它是PK吗? – Eugene 2011-11-05 00:16:21

+1

@Eugene:两列中的每一列都可以与另一个表中的PK具有外键关系 - 并非两个列都是单个外键关系。 – 2011-11-05 01:04:11

+1

@OMGPonies:感谢您回答这个问题!我一直在寻找它...我也在这里问了一个问题http://stackoverflow.com/questions/13487010/how-to-update-same-table-on-删除在MySQL中....虽然我有一些很好的答案,但我想要符合'是否有可能为我的问题编写嵌套查询'? ..我会要求你也请回答我! – 2012-11-21 15:32:08

89

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

+14

谢谢:)对我来说,数据类型是INT,但一个是无符号的,另一个不是 – 2014-03-04 09:20:52

+4

当使用模式生成器时,我经常运行'BIGINT'和'INT'。 – Xeoncross 2014-08-29 19:20:04

+0

当外键不是INT值时,我遇到了同样的问题。当外键引用它时,该列必须是唯一的。 – PhatHV 2015-09-21 09:23:22

10

错误编号。 150意味着外键约束失败。您可能在外键依赖的表之前创建此表(表keywords)。首先创建该表,它应该可以正常工作。

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

26

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

+3

感谢您的排序位。 – arahant 2014-05-25 18:00:08

18

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

+0

谢谢 - 这是我的问题。 – scipilot 2014-11-05 23:37:32

+0

这是我的问题。谢谢 – thed0ctor 2014-12-03 01:54:33

+0

如果您使用mysqldump创建了一个innodb表的sql文件,并将它们导出为myisam talbs,则会发生这种情况。 – 2017-01-03 22:51:04

2

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

-6

尝试:

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; 

你需要把一个“”之间CONSTRAINTFOREIGN

0

也许this会有帮助吗?主键列的定义应该与外键列完全相同。

2

如果一个CHARSET创建了PK台,然后你在另一个CHARSET..then创建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; 
0

得到执行确保所有表支持外键 - InnoDB引擎

22

我认为所有这些问题的答案,而正确的被误导的问题。

实际的答案是这样的,你开始恢复,如果你恢复一个转储文件与外键前:

SET FOREIGN_KEY_CHECKS=0; 

,因为自然的恢复将创建一些限制外国表甚至存在了。

3

在浏览完上面的答案并尝试了一下之后,这是解决MySQL中的外键错误(1005 - 错误150)的有效方法。

为了正确创建的外键,所有的MySQL请求是:

  • 所有被引用的键必须有主键或唯一索引。
  • 再次引用列必须与引用列具有相同的数据类型。

满足这些要求,一切都会好起来的。

7

有时MySQL只是超级愚蠢 - 我可以理解外键的原因..但在我的情况下,我刚刚删除了整个数据库,我仍然得到错误...为什么?我的意思是,没有数据库了......而且我使用的sql-user无法访问服务器上的任何其他数据库...我的意思是,服务器对于当前用户是“空的”,我仍然可以获得这个错误?很抱歉,但我猜MySQL是在骗我...但我可以对付它:)只需添加SQL的这两条线在你的fucky声明:

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

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

+0

如果在其引用的列和列之间存在实际差异,则可能会导致问题。例如。假设被引用的列是一个varchar(200),并且引用者是varchar(50),那么当尝试级联时可能会出现奇怪的行为。我没有遇到由于数据不匹配而发布errno 150的问题。 – juacala 2015-03-18 17:39:10

+0

有趣的见解@juacala :)对我来说很有趣,只要我遇到这个问题,我的方法总是修复它......直到今天至少:D但我们从未停止学习,对;) – jebbie 2015-03-19 15:35:30

+0

这实际上帮助了我一个脚本liquibase产生。脚本在MySQL> 5.5上完美运行,但5.1版失败。 – delbertooo 2015-10-20 12:38:58

1

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

2

如果两个表都有引用,例如,一个表是Student并且另一个表是Education,并且我们希望Education表具有Student表的外键引用,则会发生此错误。在这种情况下,两个表的列数据类型应该相同,否则会产生错误。

2

我在将Windows应用程序移植到Linux时遇到此错误。在Windows中,数据库表名不区分大小写,在Linux中它们区分大小写,可能是因为文件系统的差异。所以,在Windows桌Table1table1相同,并在REFERENCEStable1Table1工作。在Linux上,当应用程序使用table1而不是Table1创建数据库结构时,我看到错误#150;当我在Table1引用中做出正确的字符大小写时,它也开始在Linux上工作。因此,如果没有其他帮助,请确保在REFERENCES中,当您在Linux上时,在表名中使用正确的字符大小写。

47

通过运行SHOW ENGINE INNODB STATUS;,然后在输出中查找LATEST FOREIGN KEY ERROR,可以得到实际的错误消息。

来源:answer from another user in a similar question

+7

这实际上非常有用。它会告诉你确切的错误。 – 2014-09-04 23:34:37

+0

谢谢。这是一个耻辱MySQL Workbench没有使用这个。 – scipilot 2014-11-05 23:38:08

+0

太棒了。这非常有帮助。告诉你确切的错误。 我的是,已经将NULLABLE列设置为“on delete set null”。 非常感谢。 – 2016-07-01 12:09:26

1

一个真正的边缘的情况是,你已经使用了MySQL的工具,(续集临在我的情况),以重命名数据库。然后创建一个具有相同名称的数据库。

这将外键约束保存到相同的数据库名称,因此重命名的数据库(例如,my_db_renamed)在新创建的数据库中有外键约束(my_db)

不知道这是Sequel Pro中的错误,还是某些用例需要此行为,但它花费了我一大早的部分时间:/

0

您从子表引用的PARENT表的列必须是唯一的。如果不是,导致错误号150.

+0

它可能会值得您添加更多的细节 - 例如特定的列和表名 – Jonathan 2014-11-22 19:12:39

1

我有同样的错误。在我的情况下,错误的原因是我在约束中有一个ON DELETE SET NULL语句,而我在其中定义约束的字段有一个NOT NULL语句。在该字段中允许NULL解决了该问题。

8

有相当可能会导致错误号150,所以人们寻找这个话题,这里就是我的想法是接近详尽的列表(来源Causes of Errno 150)的几件事情:

对于错误号150或错误号121,只需输入SHOW ENGINE INNODB STATUS,就会出现一个名为“最新的外键错误”的部分。在此之下,它会给你一个非常有用的错误信息,它通常会立即告诉你什么是问题。你需要SUPER权限来运行它,所以如果你没有这些权限,你只需要测试下面的场景。

1)数据类型不匹配:该类型的列必须是同一

2)父母列没有索引(或错序索引)

3)列的排序规则唐”牛逼比赛

4)NOT NULL列

5)表的排序规则不匹配使用SET NULL:即使列排序规则匹配,在一些版本的MySQL这可能是一个问题。

6)父列实际上不存在于父表中。检查拼写(可能在列的开头或结尾处有空格)

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

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

1)您选择的约束名已被

2)在某些系统上是否有你的陈述和表名的情况不同。如果您从一台服务器转到另一台有不同的案例处理规则的服务器,这可能会让您感到困扰。

+0

在某些版本中,如果表不是innodb,则会得到errno 150,但在某些版本中它只是失败而已。 – juacala 2015-04-14 14:54:35

+0

谢谢,这真是太棒了: | ------------------------ |最新的外键错误 | ------------------------ |您已经定义了一个SET NULL条件,虽然有些是 |列被定义为NOT NULL。 – 2018-01-24 10:53:49

2

在大多数的情况下,问题是由于发动机的区别。如果是InnoDB的创建,然后父受的MyISAM &反之亦然创建应该引用表

0

我展开反倾销调查时,也有类似的问题Django的mysql数据库与单个表。我可以通过将数据库转储到文本文件来解决问题,使用emacs将相关表移动到文件末尾,并将修改的sql转储文件导入到新实例中。

HTH Uwe

1

在我的情况。我有引擎和字符集问题,因为我的主机服务器更改设置,我的新表是MyISAM,但我的旧表是InnoDB。只是我改变了。

0

我从文本文件创建数据库时遇到过这种问题。

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和运行批处理文件。

我的错误是在我的sql文件中的执行顺序。我试图用主键和外键创建表。运行时它将搜索参考表,但表不在那里。 所以它会返回那种错误。

If you creating tables with foreign key then check the reference tables were present or not. And also check the name of the reference tables and fields.

0

我已经通过使变量接受null

ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL 
1

我也有类似的问题,纠正问题,但我的是因为我加入一个新的领域是有数据的现有表,新字段引用父表中的另一个字段,并且还具有NOT NULL的定义并且没有任何默认值。 - 我发现事情不工作的原因是因为

  1. 我的新领域需要有从父表上的每个记录的值自动填充空白的领域,可应用于约束之前。每次应用约束时,都需要保持表格数据的完整性。实施约束(外键),但有迹象表明没有从父表中的值将意味着数据被损坏因此MySQL将永远不会执行你的约束

重要的是要记住,在某些数据库记录如果正常情况下你计划你的数据库以及时间提前,并实现了这种特定的情况就可以避免

更简单的方法来避免这种疑难杂症数据插入前限制是

  • 萨已经数据库表中的数据
  • 截断表数据(并表的文物,即索引等)
  • 种种限制
  • 导入数据

我希望这可以帮助别人

0

我得到了执行一系列MySQL命令时也出现同样的问题。当创建一个表的时候,我们会在引用一个尚未创建的其他表的外键时发生。这是参考前表格存在的顺序。

解决方案:在创建具有外键的子表之前先创建父表。

0

创建没有外键的表,然后分别设置外键。

0

usually, the mismatch between foreign key & primary key causes the error:150.

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

4

我同样的错误,然后我创建第一个引用的表,然后简称表

for example if you have employee and department tables your assigning foreign constraint on dept_no in employee table then make sure that the department table is created and have assigned primary key constraints to dept_no.

这个工作对我来说...

相关问题