我正在努力在数据库中创建一些表 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.
------------

我在stackoverflow和在线其他地方搜索 - 在这里遇到了一篇有用的博客文章,上面写着有关如何解决此错误的指示 - 但是我不知道怎么了。任何帮助,将不胜感激!

有帮助吗?

解决方案

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

其他提示

注意:我遇到了相同的问题,这是因为参考字段在两个不同表中的整理中是不同的(它们具有完全相同的类型)。

确保所有引用的字段具有相同的类型和相同的整理!

检查两张桌子是否具有相同的引擎。例如,如果您有:

CREATE Table FOO ();

和:

CREATE Table BAR () ENGINE=INNODB;

如果您尝试创建从表格到表Foo的约束,则它将在某些MySQL版本上使用。

通过以下内容解决问题:

CREATE Table FOO () ENGINE=INNODB;

微妙的,但是这个错误让我引起了我的看法,因为我忘了声明一列无签名,以匹配引用的现有表,该表是“未签名”。有一个未签名和一个未签名的导致MySQL阻止外键在新表上创建。

id smallint(3) not null

为了外国钥匙,不匹配

id smallint(3) unsigned not null

当我试图尝试时,我完全毫无价值且无信息错误:

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

因此,就我而言,问题在于没有null和delete set null之间的冲突。

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

例如

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返回相同错误的另一个微妙故障。

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

修复。

引用的字段必须是引用表中的“键”,不一定是主键。因此,“ CAR_ID”应该是主键,或者在“汽车”表中没有零件和唯一的约束定义。

而且,这两个字段必须具有相同的类型和整理。

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

  • 打开/private/etc/my.conf
  • 在下面 #MySQL Server, ,更改 max_allowed_packet 从1m到4M(您可能需要尝试此值。)
  • 重新启动mysql

此后,数据库成功导入。

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

检查要使您参考的字段与外国钥匙完全匹配,就我而言,一个是未签名的,另一个是签署的,所以我只是更改了它们以匹配,这有效

Alter Table Customer_information添加约束FK_CUSTOMER_INFORMATION1外键(user_id) 参考 users(id)在更新级联的删除级联

解决了:

检查以确保primary_key和fourne_key与数据类型完全匹配。如果一个未签名,则将失败。良好的做法是确保两者都是未签名的INT。

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

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

澄清:

两张表都有一个称为pk1,fk1等的约束。重命名/使其名称唯一解决了问题。

引用的列必须是单列或多列索引中的第一列的索引,以及相同的类型和相同的整理。

我的两个桌子有不同的碰撞。可以通过发行表演表状态来显示 table_name 可以通过发行Alter表来更改整理 table_name 转换为字符集UTF8。

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

我有这个错误<>问题是在我的声明中:

Alter Table System_registro_de_modificacion添加外键(usuariomodificador_id)参考usuario(id)usuario(id);

我写了错误的套管:它在Windows Wamp中起作用,但是在Linux Mysql中,它对套管更严格,因此写入“ Usuario”而不是“ Usuario”(精确的壳体),产生了错误,并得到了纠正,仅更改了更改套管。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top