【问题标题】:MySQL "Foreign key constraint is incorretly formed"MySQL“外键约束格式不正确”
【发布时间】:2018-09-04 03:17:08
【问题描述】:

这段代码有问题。

CREATE TABLE Reservation (
    Movie_Title varchar(255) NOT NULL,
    Theatre_No int NOT NULL,
    Complex_Name varchar(255) NOT NULL,
    Start_Time datetime NOT NULL,
    CustomerID int NOT NULL,
    Number_of_Tickets int NOT NULL,
    PRIMARY KEY (Movie_Title, Theatre_No, Complex_Name, Start_Time, CustomerID),
    FOREIGN KEY (Movie_Title) REFERENCES Showings(Movie_Title),
    FOREIGN KEY (Theatre_No) REFERENCES Showings(Theatre_No),
    FOREIGN KEY (Complex_Name) REFERENCES Showings(Complex_Name),
    FOREIGN KEY (Start_Time) REFERENCES Showings(Start_Time), /* this line causes error*/
    FOREIGN KEY (CustomerID) REFERENCES Customer(Account_Number)
); 

如果我摆脱这条线,它运行良好。

FOREIGN KEY (Start_Time) REFERENCES Showings(Start_Time),

参考表(Showings)如下;

CREATE TABLE Showings (
    Movie_Title varchar(255) NOT NULL,
    Theatre_No int NOT NULL,
    Complex_Name varchar(255) NOT NULL,
    Start_Time datetime NOT NULL,
    Num_Seats int NOT NULL,
    PRIMARY KEY (Movie_Title, Theatre_No, Complex_Name, Start_Time),
    FOREIGN KEY (Movie_Title) REFERENCES Movie(Title),
    FOREIGN KEY (Theatre_No) REFERENCES Theatre(Theatre_No),
    FOREIGN KEY (Complex_Name) REFERENCES Theatre(Complex_Name)
);

我正在使用 MariaDB 10.1.3

对不起,如果这最终成为一个愚蠢的错误,我对 SQL 还很陌生 请和谢谢。

【问题讨论】:

    标签: mysql sql xampp mariadb


    【解决方案1】:

    首先清理架构。 Reservation 应仅包含 CustomerShowingTheater_no 应该暗示 Complex 而不是到处都有两个这样的列。 (可能还有其他事情。)一旦你理顺了这样的事情,FK 问题可能会消失。

    【讨论】:

      【解决方案2】:

      外键cannot be added to a column that is not indexed

      MySQL 需要外键和引用键的索引,以便外键检查可以快速且不需要表扫描。

      虽然这是 MySQL 文档,但它可能与您的 MariaDB 版本失败的原因相同。

      您可以通过简单地向Showings 表中的Start_Time 列添加索引来解决此问题。

      但是,在您这样做之前,请考虑一下您究竟想用这个外键做什么。您在创建时引用了 Showings 表中的任何 Start_Time,而不是任何特定的显示。

      根据您的表设计,为Showings 表的主键创建外键更有可能是您想要实现的目标。

      CREATE TABLE Reservation (
          Movie_Title varchar(255) NOT NULL,
          Theatre_No int NOT NULL,
          Complex_Name varchar(255) NOT NULL,
          Start_Time datetime NOT NULL,
          CustomerID int NOT NULL,
          Number_of_Tickets int NOT NULL,
          PRIMARY KEY (Movie_Title, Theatre_No, Complex_Name, Start_Time, CustomerID),
          FOREIGN KEY (Movie_Title) REFERENCES Showings(Movie_Title),
          FOREIGN KEY (Theatre_No) REFERENCES Showings(Theatre_No),
          FOREIGN KEY (Complex_Name) REFERENCES Showings(Complex_Name),
          FOREIGN KEY `Showing` (Movie_Title, Theatre_No, Complex_Name, Start_Time) REFERENCES Showings(Movie_Title, Theatre_No, Complex_Name, Start_Time),
          FOREIGN KEY (CustomerID) REFERENCES Customer(Account_Number)
      ); 
      

      【讨论】:

      • 是的,谢谢,我也问过朋友。用 FOREIGN KEY Showing (Movie_Title, Theatre_No, Complex_Name, Start_Time) REFERENCES Showings(Movie_Title, Theatre_No, Complex_Name, Start_Time) 替换所有内容,解决了问题。
      • @JiahaoZhao 如果我的回答解决了您的问题,请采纳,让其他人知道问题已解决。
      • 是您帖子旁边的复选标记吗?抱歉,对这个网站还很陌生
      猜你喜欢
      • 1970-01-01
      • 2017-01-05
      • 2018-09-04
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      相关资源
      最近更新 更多