【问题标题】:MySQL : Error Code 1215 : Cannot add foreign key constraintMySQL:错误代码 1215:无法添加外键约束
【发布时间】:2016-06-04 15:29:09
【问题描述】:

我正在尝试创建一个简单的 SQL 架构,但在定义外键时遇到了一些问题。我真的没有那么多 MySQL 知识,所以我想我会向她寻求帮助。当我尝试在 HotelManagement.Reservation 表创建中创建外键 roomID 和 'guestEmail' 时,出现错误代码 1215。

CREATE database HotelManagement;

CREATE TABLE HotelManagement.Room (
  roomID            INT not null auto_increment,
  roomTaken        TINYINT(1),
  beds              INT not null,
  size              INT not null,
  roomRank          INT not null,
  PRIMARY KEY(roomID));


CREATE TABLE HotelManagement.HotelTask (
  taskType      INT         not null,
  taskStatus    TINYINT(1)  not null,
  whichRoom        INT         not null,
  note          VARCHAR(255),
  PRIMARY KEY (taskType),
  FOREIGN KEY (whichRoom) REFERENCES HotelManagement.Room(roomID));


CREATE TABLE HotelManagement.Guest (
  firstName           varchar(25)   not null,
  lastName            varchar(25)   not null,
  userPassword        varchar(25)   not null,
  email               varchar(25)   not null,
  reservation       INT,
  PRIMARY KEY (userPassword, email));


CREATE TABLE HotelManagement.Reservation (
  reservationID     INT not null,
  id_room            INT not null,
  guestEmail             varchar(25) not null,
  fromDate          DATE not null,
  toDate            DATE not null,
  PRIMARY KEY (reservationID),
  FOREIGN KEY (guestEmail)  
    REFERENCES HotelManagement.Guest(email),
  FOREIGN KEY (id_room)  
    REFERENCES HotelManagement.Room(roomID)
  );

ALTER TABLE HotelManagement.Guest
    ADD CONSTRAINT res_constr FOREIGN KEY (reservation)
        REFERENCES   HotelManagement.Reservation(reservationID);

更新了.sql

【问题讨论】:

    标签: mysql foreign-keys schema


    【解决方案1】:

    在hoteltask 表中,您已经定义了一个名为roomid 的外键。外键名称也必须是unique,因此只需为第二个外键指定一个不同的名称或完全省略名称:

    如果给出了 CONSTRAINT 符号子句,则符号值(如果使用), 在数据库中必须是唯一的。重复的符号将导致 错误类似于:ERROR 1022 (2300): Can't write;重复输入 表'#sql-464_1'。如果没有给出子句,或者没有符号 包含在 CONSTRAINT 关键字之后,约束的名称 是自动创建的。

    更新

    guest 表中的 email 字段是主键的最右边一列,这样 pk 不能用于独立查找该表中的电子邮件。要么更改 pk 中的顺序或字段,要么在来宾表中的电子邮件字段上有一个单独的索引。引用与上面相同的链接:

    MySQL 需要外键和引用键的索引,以便 外键检查可以很快并且不需要表扫描。在里面 引用表,必须有外键所在的索引 列按相同顺序列为第一列。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建,此索引可能会在稍后被静默删除 另一个可用于强制外键约束的索引。 index_name,如果给定,则如前所述使用。

    在继续创建 fks 之前,请阅读我链接的整个文档!

    旁注 2(第一个在下面的 cmets 中):您可能应该有一个唯一的数字访客 ID,因为这比使用电子邮件更有效。即使您决定坚持使用电子邮件作为 id,我也会将来宾表中的 pk 限制为仅电子邮件。使用当前的pk,如果我使用不同的密码,我可以多次使用同一电子邮件注册。

    【讨论】:

    • 您好,我在阅读您所说的之后更新了它。但我仍然看到相同的错误消息,即使我不确定此时该做什么。不过,我很感激你的回答。
    • 错误消息中有一个辅助编号,可以帮助您和我们缩小问题范围。
    • 附带说明:您不应该在客人表中存储预订ID,因为客人可能有多个预订。
    猜你喜欢
    • 2018-05-13
    • 2015-05-27
    • 2017-09-18
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2016-05-01
    • 2018-11-10
    相关资源
    最近更新 更多