我和其他许多人一样,在mySQL中臭名昭著的errno 150方面苦苦挣扎。我知道它与外键有关,并且我知道有关此问题已经有很多问题,但是在花费大量时间寻找解决方案之后,我仍未找到适合我具体情况的解决方案。这个旅行数据库几乎解决了所有错误,但是最后一个错误是在尝试创建名为leg的表时出现的。我将在与此相关的表格下方发布。

CREATE TABLE ticket(
id int UNSIGNED NOT NULL,
passenger_id int UNSIGNED,
trip_id int UNSIGNED,
leg_no int UNSIGNED,
purchased_on datetime,
reservation_date date,
PRIMARY KEY(id),
CONSTRAINT fk_ticket_passenger_id_passenger FOREIGN KEY
(passenger_id) REFERENCES passenger(id),
CONSTRAINT fk_ticket_trip_id_trip FOREIGN KEY
(trip_id) REFERENCES trip(id),
CONSTRAINT fk_ticket_leg_no_leg FOREIGN KEY
(leg_no) REFERENCES leg(leg_no));

CREATE TABLE trip(
id int UNSIGNED NOT NULL,
number_of_legs int UNSIGNED,
PRIMARY KEY(id));

CREATE TABLE leg(
trip_id int UNSIGNED NOT NULL,
leg_no int UNSIGNED NOT NULL,
origin_id int UNSIGNED,
destination_id int UNSIGNED,
depart_time time,
arrive_time time,
vdesignation varchar(255),
price decimal(13,2),
PRIMARY KEY(trip_id, leg_no),
CONSTRAINT fk_leg_trip_id_trip FOREIGN KEY
(trip_id) REFERENCES trip(id),
CONSTRAINT fk_leg_vdesignation_vehicle FOREIGN KEY
(vdesignation) REFERENCES vehicle(designation),
CONSTRAINT fk_leg_origin_id_island FOREIGN KEY
(origin_id) REFERENCES island(id),
CONSTRAINT fk_leg_destination_id_island FOREIGN KEY
(destination_id) REFERENCES island(id));

CREATE TABLE vehicle(
designation varchar(255) NOT NULL,
vtype varchar(255),
capacity int UNSIGNED,
PRIMARY KEY(designation));

CREATE TABLE island(
id int UNSIGNED NOT NULL,
iname varchar(255),
can_fly tinyint UNSIGNED,
PRIMARY KEY(id));


我知道这个问题被问了很多,而且我确信它已经老了,我将非常感谢您为我提供的任何建议。我已经对解决方案进行了彻底的搜索,似乎无法弄清楚。提前感谢您可以给我的任何信息!

编辑:这是针对该错误的特定警告信息:

*************************** 1. row ***************************
Level: Error
Code: 1005
Message: Can't create table 'travel.leg' (errno: 150)
1 row in set (0.04 sec)


编辑2:为响应第一个答案而添加了车辆表,因为我不知何故首先将其添加了。

最佳答案

我在您的leg表中看到了外键的两个潜在问题:

1.第一个问题是fk_leg_vdesignation外键

CONSTRAINT fk_leg_vdesignation_vehicle FOREIGN KEY (vdesignation)
    REFERENCES vehicle(designation)


您从未向我们显示vehicle表,因此我们无法验证那里的designation列与leg.vdesignation的类型相同,即varchar(255)。如果类型不匹配,或者vehicle.designation不存在,则应该看到150错误。

2. leg中的以下两个外键似乎都引用了island表中的同一列:

CONSTRAINT fk_leg_origin_id_island FOREIGN KEY (origin_id) REFERENCES island(id)
CONSTRAINT fk_leg_destination_id_island FOREIGN KEY (destination_id) REFERENCES island(id)


我看不到同时拥有它们的意义。此外,leg.origin_idleg.destination_id的类型为int UNSIGNED,而外部列island.id的类型为int UNSIGNED NOT NULL。由于类型不完全相同,因此可能会导致错误150。

10-06 12:56