代码之家  ›  专栏  ›  技术社区  ›  Allen Fields

无法添加第二个外键约束

  •  0
  • Allen Fields  · 技术社区  · 7 年前
    CREATE TABLE Transcripts (sID VARCHAR(7), cNo VARCHAR(10),
    semester VARCHAR(20), grade CHAR(1), PRIMARY KEY (sID)
    );
    CREATE TABLE Students (sID CHAR(7), sName VARCHAR(20),
    bDate DATE, phone VARCHAR(12), major VARCHAR(30), avgGPA VARCHAR(4), PRIMARY KEY (sID),
    FOREIGN KEY (sID)
        REFERENCES Transcripts(sID)
    );
    CREATE TABLE Courses (cNo VARCHAR(10), cTitle VARCHAR(30),
    creditHours VARCHAR(2), deptName VARCHAR(30), PRIMARY KEY (cNo),
    FOREIGN KEY (cNo)
        REFERENCES Transcripts(cNo)
    );
    

    所以每当我运行这个时,第一个外键工作正常,每当我运行下一个表时,它都会返回这个错误“error 1215(HY000):Cannot add foreign key constraint”我做错了什么?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Bill Karwin    7 年前

    这是产生错误的外键:

    FOREIGN KEY (cNo)
        REFERENCES Transcripts(cNo)
    

    但是 Transcripts(cNo) 不是该表中任何键的一部分。

    外键必须引用父表的唯一键或主键的列。

    看见 MySQL Creating tables with Foreign Keys giving errno: 150 获取外键所需的良好检查表。

        2
  •  1
  •   flip    7 年前

    在添加外键之前为外键列编制索引。

    CREATE TABLE Courses (cNo VARCHAR(10), cTitle VARCHAR(30),
        creditHours VARCHAR(2), deptName VARCHAR(30), PRIMARY KEY (cNo),
        INDEX (cNo),
        FOREIGN KEY (cNo)
            REFERENCES Transcripts(cNo)
        );
    
        3
  •  0
  •   marmeladze    7 年前

    定义 cNo 作为外键打开 Courses 表,它必须是主键 或其他表的唯一键。

    CREATE TABLE Transcripts(
      sID VARCHAR(7), 
      cNo VARCHAR(10) NOT NULL UNIQUE,
      semester VARCHAR(20), 
      grade CHAR(1), 
      PRIMARY KEY (sID)
    );
    

    http://sqlfiddle.com/#!9/fddf8

    如上所述,更改成绩单将解决您的问题。

        4
  •  0
  •   Rick James diyism    7 年前

    逻辑不是颠倒了吗?成绩单不应该有两个FK引用其他两个表吗?如前所述,首先声明其他两个表。