如何解决 errno: 150 "Foreign key constraint is incorrectly formed" 即使我的约束是正确的?
How to solve the errno: 150 "Foreign key constraint is incorrectly formed" even though my constraint is correct?
我正在尝试创建三个 tables :
- 酒店Table
CREATE TABLE Hotels(
HotelID VARCHAR(30) NOT NULL,
Name VARCHAR(30) NOT NULL,
City VARCHAR(30) NOT NULL,
Rating VARCHAR(30) NOT NULL,
Description VARCHAR(500) NOT NULL,
PRIMARY KEY (HotelID)
)
- 房间table
CREATE TABLE Rooms (
HotelID VARCHAR(30) NOT NULL,
Room_Number INT NOT NULL,
Price_Rate INT NOT NULL,
Type VARCHAR(30) NOT NULL,
PRIMARY KEY(HotelID, Room_Number),
FOREIGN KEY(HotelID) REFERENCES hotels(HotelID)
)
- 预订信息Table
CREATE TABLE BookingInfo (
HotelID VARCHAR(30) NOT NULL,
UserID VARCHAR(30) NOT NULL,
Room_Number INT NOT NULL,
Arrival_Date DATE NOT NULL,
Departure_Date DATE NOT NULL,
PRIMARY KEY(UserID, HotelID, Room_Number, Arrival_Date),
FOREIGN KEY(HotelID) REFERENCES hotels(HotelID),
FOREIGN KEY(UserID) REFERENCES users(UserID),
FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number)
)
但是当我尝试创建第三个时 table 我收到错误号:150“外键约束不正确”。
此外,当我删除 FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number)
时,table 会成功创建。但我不明白为什么它不接受 FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number)
.
我也尝试过更改 table 和更改数据类型,但仍然没有成功。谁能指出我在这段代码中的错误。
REFERENCES rooms(Room_Number) room_number 必须是键或多列键的第一个节点
'In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order.' https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
Rooms
的主键是两列:(HotelID, Room_Number)
.
BookingInfo
中的外键是一列:(Room_Number)
.
外键应引用所引用 table 的 整个 主键。如果该主键有多个列,则所有列都必须由外键引用,并且顺序相同。
非标准 SQL 且特定于 InnoDB 的注意事项:InnoDB 允许外键引用引用的 table 中的 multi-column 键的一部分,只要列是该键的 最左边 列。但在您的情况下,您引用的是该键左列的第二个 Room_Number
。所以这是不允许的。在我看来,引用部分密钥无论如何都是一个坏主意,因为它会导致奇怪的数据异常。
非常感谢指导。这段代码对我有用:
CREATE TABLE BookingInfo (
HotelID VARCHAR(30) NOT NULL,
UserID VARCHAR(30) NOT NULL,
Room_Number INT NOT NULL,
Arrival_Date DATE NOT NULL,
Departure_Date DATE NOT NULL,
PRIMARY KEY(UserID, HotelID, Room_Number, Arrival_Date),
FOREIGN KEY(UserID) REFERENCES users(UserID),
FOREIGN KEY(HotelID,Room_Number) REFERENCES rooms(HotelID,Room_Number)
)
我正在尝试创建三个 tables :
- 酒店Table
CREATE TABLE Hotels(
HotelID VARCHAR(30) NOT NULL,
Name VARCHAR(30) NOT NULL,
City VARCHAR(30) NOT NULL,
Rating VARCHAR(30) NOT NULL,
Description VARCHAR(500) NOT NULL,
PRIMARY KEY (HotelID)
)
- 房间table
CREATE TABLE Rooms (
HotelID VARCHAR(30) NOT NULL,
Room_Number INT NOT NULL,
Price_Rate INT NOT NULL,
Type VARCHAR(30) NOT NULL,
PRIMARY KEY(HotelID, Room_Number),
FOREIGN KEY(HotelID) REFERENCES hotels(HotelID)
)
- 预订信息Table
CREATE TABLE BookingInfo (
HotelID VARCHAR(30) NOT NULL,
UserID VARCHAR(30) NOT NULL,
Room_Number INT NOT NULL,
Arrival_Date DATE NOT NULL,
Departure_Date DATE NOT NULL,
PRIMARY KEY(UserID, HotelID, Room_Number, Arrival_Date),
FOREIGN KEY(HotelID) REFERENCES hotels(HotelID),
FOREIGN KEY(UserID) REFERENCES users(UserID),
FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number)
)
但是当我尝试创建第三个时 table 我收到错误号:150“外键约束不正确”。
此外,当我删除 FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number)
时,table 会成功创建。但我不明白为什么它不接受 FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number)
.
我也尝试过更改 table 和更改数据类型,但仍然没有成功。谁能指出我在这段代码中的错误。
REFERENCES rooms(Room_Number) room_number 必须是键或多列键的第一个节点
'In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order.' https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
Rooms
的主键是两列:(HotelID, Room_Number)
.
BookingInfo
中的外键是一列:(Room_Number)
.
外键应引用所引用 table 的 整个 主键。如果该主键有多个列,则所有列都必须由外键引用,并且顺序相同。
非标准 SQL 且特定于 InnoDB 的注意事项:InnoDB 允许外键引用引用的 table 中的 multi-column 键的一部分,只要列是该键的 最左边 列。但在您的情况下,您引用的是该键左列的第二个 Room_Number
。所以这是不允许的。在我看来,引用部分密钥无论如何都是一个坏主意,因为它会导致奇怪的数据异常。
非常感谢指导。这段代码对我有用:
CREATE TABLE BookingInfo (
HotelID VARCHAR(30) NOT NULL,
UserID VARCHAR(30) NOT NULL,
Room_Number INT NOT NULL,
Arrival_Date DATE NOT NULL,
Departure_Date DATE NOT NULL,
PRIMARY KEY(UserID, HotelID, Room_Number, Arrival_Date),
FOREIGN KEY(UserID) REFERENCES users(UserID),
FOREIGN KEY(HotelID,Room_Number) REFERENCES rooms(HotelID,Room_Number)
)