我正在try 创建三个表:

  1. 餐桌wine 店
    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. 房间桌子
    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. 预订信息表
    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)
    )

但是当我试图创建第三个表时,我得到了错误:150"外键约束的格式不正确".

此外,当我删除FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number)个表时,表被成功创建.但我不明白为什么它不接受FOREIGN KEY (Room_Number) REFERENCES rooms(Room_Number).

我也try 过更改表和数据类型,但仍然没有成功.谁能指出我的密码中的错误吗.

推荐答案

Rooms的主键是两列:(HotelID, Room_Number).

BookingInfo中的外键是一列:(Room_Number).

外键应该引用引用表的whole主键.如果主键有多个列,则外键必须以相同的顺序引用所有列.


注意事项:InnoDB允许外键引用被引用表中多列键的一部分,只要该列是该键的leftmost列.但在你的例子中,你引用的是该键左栏的第二个,Room_Number.所以这是不允许的.在我看来,引用部分密钥是个坏主意,因为它会导致奇怪的数据异常.

Mysql相关问答推荐

MySQL在带有特定属性值上的对象的数组的杨森对象中搜索

如果WHERE语句包含所有列,唯一键顺序是否重要?

MySQL逻辑全部

MySQL grant语句中的用户名区分大小写

在MySQL的join查询中进行计算

将上传文件的存储路径放在一张表中的缺点是什么?

带有 JOIN 和 WHERE 子句的 INSERT 语句

根据 MySql 中同一表中的多列 Select 多列

使用索引进行查询优化

MySQL,递归 CTE.它如何以这种句法形式工作?

如何在 mysql 中获取 Day Wise 的平均值?

为什么这个查询需要超过 5 秒才能运行?

如何使用 SQL 聚合和求和相似 Select 的值?

如何知道 Select 查询花费了多少时间?

MySQL如何通过外键ID Select 多行?

最好的 MySQL 性能调优工具?

一次查询 MySQL 插入多行

如何将本地托管的 MySQL 数据库与 docker 容器连接

与 MySql 的连接正在自动中止.如何正确配置Connector/J?

在 PHP 中运行 MySQL *.sql 文件