MySQL:Can';t创建表(错误号:150)

MySQL:Can';t创建表(错误号: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上,
Table1
Table1
相同,在
REFERENCES
中,
Table1
Table1
都起作用。在Linux上,当应用程序在创建数据库结构时使用
table1
而不是
table1
时,我看到错误#150;当我在
Table1
references中创建正确的字符大小写时,它也开始在Linux上工作。因此,如果没有其他帮助,请确保在Linux上运行时,在
引用中的表名中使用了正确的字符大小写。

您可以通过运行
SHOW ENGINE INNODB STATUS
然后在输出中查找
最新外键错误


来源:

真正的edge案例是使用MySQL工具(在我的例子中是Sequel Pro)重命名数据库。然后创建了一个同名的数据库

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


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

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

我也有同样的错误。在我的例子中,错误的原因是我在约束中有一个ON DELETE SET NULL语句,而我在其中放置约束的字段
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 
ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR( 2 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL