2010-05-09 121 views
43

我正在创建数据库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 - 但我不明白什么是错的。任何帮助,将不胜感激!

+0

另请参阅http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ – 2013-06-21 16:22:00

回答

34

您应该使car_id成为汽车的主钥匙。

+0

谢谢!不敢相信这是一个愚蠢的错误。 – 2010-05-09 20:22:32

+0

顺便说一句,如果你正在改变应用程序表(其中有行)插入car_id作为一个新的外键,Applications.car_id应该是空的,否则你会得到类似的错误。这就是我发生的事情。 – cawecoy 2014-07-15 22:30:45

+0

在我的情况下,由于参考表中已经有一个主键,所以使参考键具有唯一性就足够了。 – 2016-07-29 16:48:03

30

注:我有同样的问题,这是因为引用的字段在2个不同的表(他们有完全相同的类型)不同的排序规则。

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

+2

+1有关整理的信息。你知道为什么排序规则会影响创建索引,即使数据类型相同。 – user325643 2011-08-27 06:30:33

+0

我认为这是有道理的,因为当我们使用不同的排序规则时,底层数据是不同的,并且部分mysql检查外键是为了确保数据完全相同......但我不知道官方原因;) – NickT 2011-09-07 07:50:17

+0

如果您的下一个问题是如何更改现有表的排序规则:http://stackoverflow.com/questions/742205/mysql-alter-table-collat​​ion#5468980 – penfold 2012-11-01 08:09:50

3

我使用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); 

固定它。

8

微妙,但是这个错误让我感到厌烦,因为我忘记声明一个smallint列作为unsigned来匹配被引用的现有表“smallint unsigned”。有一个unsigned而另一个没有unsigned导致MySQL阻止在新表上创建外键。

id smallint(3) not null 

不匹配,外键的缘故,

id smallint(3) unsigned not null 
+0

这节省了我很多时间! – 2014-07-02 17:11:11

+0

谢谢你。 – Klav 2016-02-17 15:16:50

8

我得到这个完全没有价值和不提供信息的错误,当我尝试:

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之间的冲突。

13

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

CREATE Table FOO(); 

和:

CREATE Table BAR() ENGINE=INNODB; 

如果您尝试创建从表BAR表FOO约束,也不会在特定的MySQL版本。

按照解决问题:

CREATE Table FOO() ENGINE=INNODB; 
2

引用的字段必须是一个“关键”在引用表,不一定是主键。所以“car_id”应该是主键,或者在“Cars”表中用NOT NULL和UNIQUE约束来定义。

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

0

一切,我解决的问题,并希望分享:

我有这个错误<> 的问题是,在我的发言:

ALTER TABLE system_registro_de_modificacion添加外键 ( usuariomodificador_id)参考文献Usuario(id)On delete restrict;

我曾错误地写套管:它工作在Windows WAMP,但在Linux中的MySQL更严格的外壳,所以书面方式,而不是“usuario”(确切的外壳)“Usuario”,所产生的误差,只是改变了套管而已被纠正。

+1

我不认为答案与问题相关,问题中的外壳是无可挑剔的,如果问题出在这里,mysql应该给出不同的错误信息。 – 2014-02-04 20:21:04

3

此外,两个表都需要具有相同的字符集。

例如,

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返回相同的错误。

2

当试图导入整个数据库(〜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。

0

我正在使用重复的外键名称。

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

澄清:

两个表有一个名为PK1,FK1约束,等他们重命名/制作独特的解决了这个问题的名称。

1

检查,以你引用到外地与外键的精确匹配,在我的情况下,一个是无符号和其他的签署,所以我只是改变了他们匹配和这个工作

ALTER TABLE customer_information 添加约束fk_customer_information1 外键(user_id) 参考usersid) ON DELETE CASCADE ON UPDATE CASCADE

0

的参考列必须是单个列的索引或第一式柱多列索引中的n,以及相同的类型和相同的排序规则。

我的两个表格有不同的排序规则。可以通过发布显示表状态(如table_name)来显示,并且可以通过发布改变表table_name将其转换为字符集utf8来更改排序规则。

1

解决:

检查以确保Primary_Key和Foreign_Key与数据类型精确匹配。 如果一个签名另一个无符号,它将失败。 好的做法是确保两者都是无符号整数。

相关问题