为什么我不能在此添加外键约束?

时间:2014-08-04 01:18:56

标签: mysql foreign-keys

    CREATE TABLE usertypes (
        userType INTEGER, 
        userName VARCHAR(12),
        PRIMARY KEY(userType)
    );   

    CREATE TABLE Users (
        loginid CHAR(9),
        name VARCHAR(15),
        netid VARCHAR(15) NOT NULL,
        password VARCHAR(15) NOT NULL,
        userType INTEGER,
        PRIMARY KEY (loginid),
        UNIQUE (netid),
        FOREIGN KEY (userType) REFERENCES usertypes(userType)
            ON DELETE NO ACTION
    );         

    CREATE TABLE Courses (
        majorid CHAR(3), 
        cid CHAR (3),
        secNum CHAR(2),
        year CHAR(4),
        semesterid CHAR(2),
        profID CHAR(9),
        PRIMARY KEY (majorid,cid,secNum,year,semesterid),
        FOREIGN KEY (majorid) REFERENCES Majors (majorid),
        FOREIGN KEY (profID) REFERENCES Users(loginid)
    );

    create table transcript(
        cid char(3),
        grade char(2),
        primary key(cid, grade),
        foreign key(cid) references courses(cid)
    );

我无法在成绩单中添加外键cid。课程专业的外键很好,但成绩单中的外键不起作用。

这是错误 错误代码:1215。无法添加外键约束

2 个答案:

答案 0 :(得分:1)

Course.cid不是密钥,因此transcript无法创建外键。请尝试以下方法:

CREATE TABLE Courses (
        majorid CHAR(3), 
        cid CHAR (3),
        secNum CHAR(2),
        year CHAR(4),
        semesterid CHAR(2),
        profID CHAR(9),
        PRIMARY KEY (majorid,cid,secNum,year,semesterid),
        KEY (cid)
    );

答案 1 :(得分:1)

简短版本是因为我认为您不能将外键标识为主键或具有唯一约束的内容,请参阅Foreign Key to non-primary key

我不确定你是如何在课程表中使用cid的,如果它可能是110并且有一个数学110和一个物理110.这就有问题,如果有人的成绩单上有110,它是指数学还是物理?

如果cid是主键,每个类的唯一值,它应该是一个主键本身。如果您在数学和物理学方面处于110,那么最好通过添加每行唯一的主键来实现,例如标识,自动递增键。