MySQL“错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)”

Posted

技术标签:

【中文标题】MySQL“错误 1005 (HY000): 无法创建表 \'foo.#sql-12c_4\' (errno: 150)”【英文标题】:MySQL "ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150)"MySQL“错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)” 【发布时间】:2011-02-17 10:43:35 【问题描述】:

我正在努力在数据库foo 中创建一些表,但每次我最终得到关于外键的 errno 150。首先,这是我创建表格的代码:

CREATE TABLE Clients
(
client_id                CHAR(10)  NOT NULL ,
client_name              CHAR(50)  NOT NULL ,
provisional_license_num  CHAR(50)  NOT NULL ,
client_address           CHAR(50)  NULL ,
client_city              CHAR(50)  NULL ,
client_county            CHAR(50)  NULL ,
client_zip               CHAR(10)  NULL ,
client_phone             INT       NULL ,
client_email             CHAR(255) NULL ,
client_dob               DATETIME  NULL ,
test_attempts            INT       NULL
);
CREATE TABLE Applications
(
application_id   CHAR(10) NOT NULL ,
office_id        INT      NOT NULL ,
client_id        CHAR(10) NOT NULL ,
instructor_id    CHAR(10) NOT NULL ,
car_id           CHAR(10) NOT NULL ,
application_date DATETIME NULL 
);
CREATE TABLE Instructors
(
instructor_id      CHAR(10)  NOT NULL ,
office_id          INT       NOT NULL ,
instructor_name    CHAR(50)  NOT NULL ,
instructor_address CHAR(50)  NULL ,
instructor_city    CHAR(50)  NULL ,
instructor_county  CHAR(50)  NULL ,
instructor_zip     CHAR(10)  NULL ,
instructor_phone   INT       NULL ,
instructor_email   CHAR(255) NULL ,
instructor_dob     DATETIME  NULL ,
lessons_given      INT       NULL 
);
CREATE TABLE Cars
(
car_id             CHAR(10) NOT NULL ,
office_id          INT      NOT NULL ,
engine_serial_num  CHAR(10) NULL ,
registration_num   CHAR(10) NULL ,
car_make           CHAR(50) NULL ,
car_model          CHAR(50) NULL 
);
CREATE TABLE Offices
(
office_id       INT       NOT NULL ,
office_address  CHAR(50)  NULL ,
office_city     CHAR(50)  NULL ,
office_County   CHAR(50)  NULL ,
office_zip      CHAR(10)  NULL ,
office_phone    INT       NULL ,
office_email    CHAR(255) NULL 
);
CREATE TABLE Lessons
(
lesson_num     INT            NOT NULL ,
client_id      CHAR(10)       NOT NULL ,
date           DATETIME       NOT NULL ,
time           DATETIME       NOT NULL ,
milegage_used  DECIMAL(5, 2)  NULL ,
progress       CHAR(50)       NULL 
);
CREATE TABLE DrivingTests
(
test_num     INT       NOT NULL ,
client_id    CHAR(10)  NOT NULL ,
test_date    DATETIME  NOT NULL ,
seat_num     INT       NOT NULL ,
score        INT       NULL ,
test_notes   CHAR(255) NULL 
);

ALTER TABLE Clients ADD PRIMARY KEY (client_id);
ALTER TABLE Applications ADD PRIMARY KEY (application_id);
ALTER TABLE Instructors ADD PRIMARY KEY (instructor_id);
ALTER TABLE Offices ADD PRIMARY KEY (office_id);
ALTER TABLE Lessons ADD PRIMARY KEY (lesson_num);
ALTER TABLE DrivingTests ADD PRIMARY KEY (test_num);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Instructors FOREIGN KEY (instructor_id) REFERENCES Instructors (instructor_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY (car_id) REFERENCES Cars (car_id);
ALTER TABLE Lessons ADD CONSTRAINT FK_Lessons_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Cars ADD CONSTRAINT FK_Cars_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Clients ADD CONSTRAINT FK_DrivingTests_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);

这些是我得到的错误:

mysql> ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY
(car_id) REFERENCES Cars (car_id);
ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150)

我运行了SHOW ENGINE INNODB STATUS,它给出了更详细的错误描述:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
100509 20:59:49 Error in foreign key constraint of table foo/#sql-12c_4:
 FOREIGN KEY (car_id) REFERENCES Cars (car_id):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
------------

我在 *** 和其他在线网站上搜索 - came across a helpful blog post here with pointers on how to resolve this error - 但我不知道出了什么问题。任何帮助将不胜感激!

【问题讨论】:

另见verysimple.com/2006/10/22/… 【参考方案1】:

已解决:

检查以确保 Primary_Key 和 Foreign_Key 与数据类型完全匹配。 如果一个签名另一个未签名,它将失败。 好的做法是确保两者都是 unsigned int。

【讨论】:

【参考方案2】:

引用的列必须是单列的索引或多列索引的第一列,且类型相同,排序规则相同。

我的两个表有不同的排序规则。它可以通过像table_name这样发出show table status来显示,并且可以通过发出alter table table_name convert to character set utf8来改变排序规则。

【讨论】:

【参考方案3】:

我使用了重复的外键名称。

重命名 FK 名称解决了我的问题。

澄清:

两个表都有一个称为 PK1、FK1 等的约束。重命名它们/使名称唯一可以解决问题。

【讨论】:

【参考方案4】:

检查以使您引用的字段与外键完全匹配,在我的情况下,一个未签名,另一个已签名,所以我只是将它们更改为匹配,这有效

ALTER TABLE customer_information 添加约束 fk_customer_information1 外键 (user_id) 参考users(id) 删除级联 更新级联

【讨论】:

【参考方案5】:

所有,我解决了一个问题并想分享它:

我遇到了这个错误 问题在于我的声明中:

alter table system_registro_de_modificacion 添加外键 (usuariomodificador_id) 参考 Usuario(id) 删除限制;

我写错了 CASING:它在 Windows WAMP 中工作,但在 Linux MySQL 中它对 CASING 更严格,所以写“usuario”而不是“usuario”(精确大小写),产生错误,并被纠正只需更换外壳即可。

【讨论】:

我认为答案与问题无关,问题中的大小写无可挑剔,如果问题是因为这个,mysql应该给出不同的错误消息。【参考方案6】:

在尝试导入整个数据库 (~800 MB) 时,我还收到了这个错误(对于几个表)以及约束错误以及 MySQL 连接和断开连接。我的问题是 MySQL 服务器 允许的最大数据包太低的结果。要解决这个问题(在 Mac 上):

已打开 /private/etc/my.conf 在# MySQL 服务器下,将max_allowed_packet 从 1M 更改为 4M(您可能需要试验这个值。) 重启 MySQL

之后数据库导入成功。

请注意,我正在为 Mac OS X(x86 64 位)运行 MySQL 5.5.12。

【讨论】:

【参考方案7】:

两个表也需要具有相同的字符集。

例如

CREATE TABLE1 (
  FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY,
  FIELD2 VARCHAR(100) NOT NULL
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin;

CREATE TABLE2 (
  Field3 varchar(64) NOT NULL PRIMARY KEY,
  Field4 varchar(64) NOT NULL,
  CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1)
) ENGINE=InnoDB;

将失败,因为它们具有不同的字符集。这是 mysql 返回相同错误的另一个微妙故障。

【讨论】:

相同的引擎也很重要。如果您从 linux 导出转储(使用 MyISAM);在 Windows 上导入它(保留 MyISAM); windows上创建表可能会使用InnoDB,也会发生外键错误。【参考方案8】:

被引用的字段必须是被引用表中的“键”,不一定是主键。因此,“car_id”应该是主键,或者在“Cars”表中使用 NOT NULL 和 UNIQUE 约束定义。

此外,两个字段必须是相同的类型和排序规则。

【讨论】:

【参考方案9】:

检查两个表是否具有相同的 ENGINE。例如,如果您有:

CREATE Table FOO ();

和:

CREATE Table BAR () ENGINE=INNODB;

如果您尝试创建从表 BAR 到表 FOO 的约束,它将无法在某些 MySQL 版本上工作。

通过以下方式解决问题:

CREATE Table FOO () ENGINE=INNODB;

【讨论】:

Use InnoDB【参考方案10】:

当我尝试这样做时,我得到了这个完全没有价值且无意义的错误:

ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;

我的问题出在我的 cmets 表中,user_id 定义为:

`user_id` int(10) unsigned NOT NULL

所以...就我而言,问题在于 NOT NULL 和 ON DELETE SET NULL 之间的冲突。

【讨论】:

【参考方案11】:

很微妙,但是这个错误让我感到困惑,因为我忘记将 smallint 列声明为无符号以匹配引用的现有表,即“smallint 无符号”。一个未签名和一个未签名导致 MySQL 阻止在新表上创建外键。

id smallint(3) not null

不匹配,为了外键,

id smallint(3) unsigned not null

【讨论】:

这为我节省了很多时间!【参考方案12】:

我使用的是 Ubuntu linux,在我的情况下,错误是由不正确的语句语法引起的(我通过在终端输入 perror 150 发现了这一点,它给出了

MySQL 错误代码 150:外键约束格式错误

更改查询的语法
alter table scale add constraint foreign key (year_id) references year.id;

alter table scale add constraint foreign key (year_id) references year(id);

修复它。

【讨论】:

【参考方案13】:

注意:我遇到了同样的问题,这是因为引用的字段在 2 个不同的表中处于不同的排序规则中(它们具有完全相同的类型)。

确保所有引用的字段都具有相同的类型和相同的排序规则!

【讨论】:

+1 获取有关整理的信息。你知道为什么即使数据类型相同,排序规则也会影响创建索引。 我认为这是有道理的,因为当我们使用不同的排序规则时,底层数据是不同的,而 mysql 检查外键的一部分是确保数据完全相同......但我没有不知道官方原因;) 如果您的下一个问题是如何更改现有表的排序规则:***.com/questions/742205/…【参考方案14】:

你应该让 car_id 成为汽车的主键。

【讨论】:

顺便说一句,如果您正在更改 Applications 表(其中包含行),将 car_id 作为新外键插入,Applications.car_id 应该可以为空,否则您会收到类似的错误。这就是发生在我身上的事。 在我的例子中,使引用键唯一就足够了,因为引用表中已经有一个主键。

以上是关于MySQL“错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)”的主要内容,如果未能解决你的问题,请参考以下文章

MySQL

mysql初学,mysql修改,mysql查找,mysql删除,mysql基本命令

mysql(设置/更改mysql密码,连接MySQL,MySQL常用命令,MySQL两种引擎区别)

MySQL教程

MySQL

MySQL