如何解决 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 :

  1. 酒店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)
    
    )
  1. 房间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)
    )
  1. 预订信息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)
    
    )