MySQL“错误1005(HY000):无法创建表'foo。#sql-12c_4'(错误:150)”
我正在创建数据库foo
中的某些表,但每次我最终都会遇到errno 150关于外键。首先,这是我创建表的代码:MySQL“错误1005(HY000):无法创建表'foo。#sql-12c_4'(错误: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.
------------
我搜索周围StackOverflow和其他在线 - came across a helpful blog post here with pointers on how to resolve this error - 但我不明白什么是错的。任何帮助,将不胜感激!
您应该使car_id成为汽车的主钥匙。
谢谢!不敢相信这是一个愚蠢的错误。 – 2010-05-09 20:22:32
顺便说一句,如果你正在改变应用程序表(其中有行)插入car_id作为一个新的外键,Applications.car_id应该是空的,否则你会得到类似的错误。这就是我发生的事情。 – cawecoy 2014-07-15 22:30:45
在我的情况下,由于参考表中已经有一个主键,所以使参考键具有唯一性就足够了。 – 2016-07-29 16:48:03
注:我有同样的问题,这是因为引用的字段在2个不同的表(他们有完全相同的类型)不同的排序规则。
确保所有引用的字段具有相同的类型和相同的排序规则!
+1有关整理的信息。你知道为什么排序规则会影响创建索引,即使数据类型相同。 – user325643 2011-08-27 06:30:33
我认为这是有道理的,因为当我们使用不同的排序规则时,底层数据是不同的,并且部分mysql检查外键是为了确保数据完全相同......但我不知道官方原因;) – NickT 2011-09-07 07:50:17
如果您的下一个问题是如何更改现有表的排序规则:http://stackoverflow.com/questions/742205/mysql-alter-table-collation#5468980 – penfold 2012-11-01 08:09:50
我使用Ubuntu Linux操作系统,在我的情况下,错误是由不正确的语句语法(我发现通过在终端,这给
MySQL错误代码150输入PERROR 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);
固定它。
微妙,但是这个错误让我感到厌烦,因为我忘记声明一个smallint列作为unsigned来匹配被引用的现有表“smallint unsigned”。有一个unsigned而另一个没有unsigned导致MySQL阻止在新表上创建外键。
id smallint(3) not null
不匹配,外键的缘故,
id smallint(3) unsigned not null
这节省了我很多时间! – 2014-07-02 17:11:11
谢谢你。 – Klav 2016-02-17 15:16:50
我得到这个完全没有价值和不提供信息的错误,当我尝试:
ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;
我的问题是在我评论表中,user_id被定义为:
`user_id` int(10) unsigned NOT NULL
所以...在我的情况下,问题是与NOT NULL和ON DELETE SET NULL之间的冲突。
检查两个表具有相同的ENGINE。例如,如果您有:
CREATE Table FOO();
和:
CREATE Table BAR() ENGINE=INNODB;
如果您尝试创建从表BAR表FOO约束,也不会在特定的MySQL版本。
按照解决问题:
CREATE Table FOO() ENGINE=INNODB;
引用的字段必须是一个“关键”在引用表,不一定是主键。所以“car_id”应该是主键,或者在“Cars”表中用NOT NULL和UNIQUE约束来定义。
此外,这两个字段必须是相同的类型和排序规则。
一切,我解决的问题,并希望分享:
我有这个错误<> 的问题是,在我的发言:
ALTER TABLE system_registro_de_modificacion添加外键 ( usuariomodificador_id)参考文献Usuario(id)On delete restrict;
我曾错误地写套管:它工作在Windows WAMP,但在Linux中的MySQL更严格的外壳,所以书面方式,而不是“usuario”(确切的外壳)“Usuario”,所产生的误差,只是改变了套管而已被纠正。
我不认为答案与问题相关,问题中的外壳是无可挑剔的,如果问题出在这里,mysql应该给出不同的错误信息。 – 2014-02-04 20:21:04
此外,两个表都需要具有相同的字符集。
例如,
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返回相同的错误。
当试图导入整个数据库(〜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。
我正在使用重复的外键名称。
重命名FK名称解决了我的问题。
澄清:
两个表有一个名为PK1,FK1约束,等他们重命名/制作独特的解决了这个问题的名称。
检查,以你引用到外地与外键的精确匹配,在我的情况下,一个是无符号和其他的签署,所以我只是改变了他们匹配和这个工作
ALTER TABLE customer_information 添加约束fk_customer_information1 外键(user_id
) 参考users
(id
) ON DELETE CASCADE ON UPDATE CASCADE
的参考列必须是单个列的索引或第一式柱多列索引中的n,以及相同的类型和相同的排序规则。
我的两个表格有不同的排序规则。可以通过发布显示表状态(如table_name
)来显示,并且可以通过发布改变表table_name
将其转换为字符集utf8来更改排序规则。
解决:
检查以确保Primary_Key和Foreign_Key与数据类型精确匹配。 如果一个签名另一个无符号,它将失败。 好的做法是确保两者都是无符号整数。
另请参阅http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ – 2013-06-21 16:22:00