【问题标题】:MySQL Database Can't Add Foreign KeyMySQL 数据库无法添加外键
【发布时间】:2015-04-23 20:48:56
【问题描述】:

我在向我的 MySQL 数据库添加一些外键约束时遇到问题。例如,在这个注册表(用于记录学生出勤的出勤注册表)中,我希望将 fk_unit_id 和 fk_student_id 作为引用 Unit 和 Student 中的主键的外键。

注册表:

CREATE TABLE IF NOT EXISTS register 
(
fk_unit_id INT(4) NOT NULL,
fk_student_id INT(4) NOT NULL,
register_date DATE NOT NULL,
attendance CHAR(1) NOT NULL,
PRIMARY KEY (fk_unit_id, fk_student_id, register_date),
FOREIGN KEY (fk_unit_id) REFERENCES unit(unit_id),
FOREIGN KEY (fk_student_id) REFERENCES student(student_id)
);

学生桌:

CREATE TABLE IF NOT EXISTS student
(
student_id INT(4) ZEROFILL NOT NULL AUTO_INCREMENT,
student_first_name VARCHAR(20) NOT NULL,
student_surname VARCHAR(20) NOT NULL,
student_dob DATE NOT NULL,
student_contact_no VARCHAR(11) NOT NULL,
student_email VARCHAR(30) NOT NULL,
student_address VARCHAR(50) NOT NULL,
student_image_name VARCHAR(30) NOT NULL,
PRIMARY KEY (student_id)
);

单位表:

CREATE TABLE IF NOT EXISTS unit
(
unit_id INT(4) ZEROFILL NOT NULL AUTO_INCREMENT,
unit_name VARCHAR(50) NOT NULL,
unit_day VARCHAR(10) NOT NULL,
unit_time VARCHAR (10) NOT NULL,
fk_course_code VARCHAR(4) NOT NULL,
fk_lecturer_id INT(4) NOT NULL,
PRIMARY KEY (unit_id),
FOREIGN KEY (fk_course_code) REFERENCES course(course_code),
FOREIGN KEY (fk_lecturer_id) REFERENCES lecturer(lecturer_id)
);

作为记录,fk_course_code 确实适用于 Course(course_code),它是一个 VARCHAR(4),所以我想知道它是否不喜欢使用 auto_incremented 主键作为外键??

编辑

我收到错误代码 #1215 - 无法添加外键限制

任何帮助将不胜感激!

【问题讨论】:

  • mysql 通常根本不关心字段是什么类型。您几乎可以使用任何字段作为外键,但两个表中的字段定义必须几乎相同。例如您可以将unsigned int 链接到unsigned int,但不能将int 链接到bigint 或varchar 到text。唯一的例外是子表中的字段可以为空,即使父字段是not null。
  • 一个学生可以多次注册同一单元吗?如果不是,那么我认为这是不正确的:PRIMARY KEY (fk_unit_id, fk_student_id, register_date), 在这种情况下你只需要PRIMARY KEY (fk_unit_id, fk_student_id),。
  • 如何知道外键是否失效?您收到任何错误消息吗?
  • 您也可能不需要学生表中的课程信息,因为单元表会处理这些信息,然后注册表会通过单元将学生与课程匹配。
  • 关于外键的 MySQL 文档在将它们用作外键之前使用列的索引,如下所示:INDEX (fk_course_code), FOREIGN KEY (fk_course_code) REFERENCES course(course_code) 我不知道这是否是您问题的根源。

标签: mysql database


【解决方案1】:

Student 和 Unit 表中的两个主键都配置了 ZEROFILL,但 Register 表中引用它们的列没有。外键列的属性必须与它们在外表中引用的列完全匹配。

我建议您将注册创建更改如下:

CREATE TABLE IF NOT EXISTS register 
(
    fk_unit_id INT(4) ZEROFILL NOT NULL,
    fk_student_id INT(4) ZEROFILL NOT NULL,
    register_date DATE NOT NULL,
    attendance CHAR(1) NOT NULL,
    PRIMARY KEY (fk_unit_id, fk_student_id, register_date),
    CONSTRAINT `c_fk_unit_id` FOREIGN KEY (fk_unit_id) REFERENCES unit(unit_id),
    CONSTRAINT `c_fk_student_id` FOREIGN KEY (fk_student_id) REFERENCES student(student_id)
);

我会建议其他优化和更改,但它们超出了发布的问题的范围。

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 2013-02-26
    • 2017-05-10
    • 2016-03-01
    • 2019-01-15
    • 2013-03-10
    • 2021-11-05
    相关资源
    最近更新 更多