【问题标题】:Adding primary/foreign keys and referencing other tables添加主键/外键并引用其他表
【发布时间】:2017-01-22 14:13:27
【问题描述】:

我在键引用方面遇到了一些问题。当我尝试将数据插入表标记时出现错误

INSERT INTO Mark(examID, studentID, result, occured, noOFAttempts) 
    VALUES ('B10', '1', '67', '11-JUL-07', '1');

我得到错误:

 integrity constraint  violated - parent key
not found

上下文:

Exam 和 Student 表代表有关大学考试和 学生。学生的考试成绩,包括人数 学生在考试中的尝试次数 (noOfAttempts),记录在 使用 Exam 中的 id 列和来自 Exam 的 id 列进行标记 学生。两个 id 列都有唯一的值。一个学生只有 每次考试记录的最新成绩。

编写一个 SQL 命令来创建 Mark 表。包括主键 和在上面指定的表中明显的外键。

CREATE TABLE Exam (
 id VARCHAR(255),
 subject VARCHAR(255),
 noOfStudents INT,
 PRIMARY KEY (id));

-

CREATE TABLE Student (
id INT,
name VARCHAR(255),
PRIMARY KEY (id));

-

CREATE TABLE Mark (
examID VARCHAR(255),
studentID INT,
result INT,
occured DATE,
noOFAttempts VARCHAR(255),
FOREIGN KEY (noOFAttempts) REFERENCES Exam(id), 
FOREIGN KEY (noOFAttempts) REFERENCES Student(id));

如何解决我知道与错误引用有关的错误,谢谢

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    Mark 表背后的一些逻辑对我来说很有意义。它将考试与参加这些考试的学生联系起来。但是让noOfAttempts 成为外键的动机似乎并没有多大用处。该表两个外键,examIDstudentID,这两个字段的组合也是一个主键。为了避免这些错误,Mark 定义可能看起来像这样:

    CREATE TABLE Mark (
        examID VARCHAR(255),
        studentID INT,
        result INT,
        occured DATE,
        noOFAttempts VARCHAR(255),
        FOREIGN KEY (examID) REFERENCES Exam(id), 
        FOREIGN KEY (studentID) REFERENCES Student(id),
        PRIMARY KEY (examID, studentID)
    )
    

    同样,我认为将noOfAttempts 设为任何类型的键都没有意义,我认为它应该只是Mark 表中的一个常规列。

    根据 Gordon 的请求进行编辑:

    当您进行插入时,您尝试在 Mark 中创建一条记录,该记录引用了不存在的父记录。对于您的原始表,您尝试将 '1' 插入为 noOfAttempts,但此 ID 在 Exam 和/或 Student 表中都不存在。

    【讨论】:

    • @GordonLinoff 已更新,感谢您的警惕。
    • 感谢 Tim 和 @GordonLinoff,这让我的错误变得清晰,用数据更新了表格并解决了问题。不要以为我完全清醒了哈哈。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2020-01-18
    • 2014-05-05
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多