【问题标题】:SQL double foreign key in single table单表中的SQL双外键
【发布时间】:2017-02-26 18:35:09
【问题描述】:

我是一个 sql 初学者。我正在创建一个数据库来跟踪学生的入学情况。

我使用以下方法创建了前 3 个学生、学校和班级表(数据库必须跟踪学生所在班级):

CREATE TABLE Students (
        studId int NOT NULL AUTO_INCREMENT primary key,
        name varchar(20),
        surname varchar(20),
        birthDate date,
        birthPlace varchar(40)
    );

CREATE TABLE Schools (
    schId varchar(20) NOT NULL primary key,
    name varchar(50),
    province char(2),
    region varchar(20)
);

CREATE TABLE Classes (
    classId int NOT NULL AUTO_INCREMENT,
    schId varchar(20),
    FOREIGN KEY (schId) REFERENCES Schools(schId),
    PRIMARY KEY (classId, schId),
    name varchar(5),
    course varchar(20),
    option varchar(20)
);

现在,我需要一个 Enroll 表,但这会导致错误:

CREATE TABLE Enrolls(
    studId int,
    schId varchar(20),
    classId varchar(20),
    FOREIGN KEY (schId) REFERENCES Schools(schId),
    FOREIGN KEY (studId) REFERENCES Students(studId),
    FOREIGN KEY (classId) REFERENCES Classes(classId),
    PRIMARY KEY(studId, schId, classId)
);

我想是因为 classId 是 Classes 表中带有 schId 的主键。

我该如何解决?

ERROR 1005 (HY000): Can't create table studentsdb.enrolls (errno: 150 "Foreign key constraint is wrongly forms")

【问题讨论】:

  • 请发布错误信息。
  • ERROR 1005 (HY000): Can't create table studentsdb.enrolls (errno: 150 "外键约束格式不正确")
  • 乍一看schId varchar(20)也必须为NULL
  • 乍一看,classId varchar(20) 必须是 int,就像在引用的表中一样。
  • 第三眼选项是保留字

标签: mysql sql


【解决方案1】:

希望能解决问题

您在表Enrolls 中的classIDvarchar(20) 类型,在表Classes 中是int 类型。

确保它们都具有相同的类型。 错误会消失!!

【讨论】:

    【解决方案2】:

    请尝试运行以下代码

    尝试 sqlfiddle 成功运行。已标记更改。

    Sqlfiddle 链接 - http://sqlfiddle.com/#!9/f7dd7/1/0

    CREATE TABLE Students (
            studId int NOT NULL AUTO_INCREMENT primary key,
            name varchar(20),
            surname varchar(20),
            birthDate date,
            birthPlace varchar(40)
        );
    
    CREATE TABLE Schools (
        schId varchar(20) NOT NULL primary key,
        name varchar(50),
        province char(2),
        region varchar(20)
    );
    
    CREATE TABLE Classes (
        classId int NOT NULL AUTO_INCREMENT,
        schId varchar(20),
        name varchar(5),
        course varchar(20),
        option_a varchar(20), -- not accepting column name "option"
      FOREIGN KEY (schId) REFERENCES Schools(schId),
      PRIMARY KEY (classId, schId)
    );
    
    
    CREATE TABLE Enrolls(
        studId int, --changed data type to int i think due to which issue was coming also suggested in other answers.
        schId varchar(20),
        classId int,
        FOREIGN KEY (schId) REFERENCES Schools(schId),
        FOREIGN KEY (studId) REFERENCES Students(studId),
        FOREIGN KEY (classId) REFERENCES Classes(classId),
        PRIMARY KEY(studId, schId, classId)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多