MySQL数据库无法添加外键。

3

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

Register表:

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_code)一起使用,该课程是VARCHAR(4),所以我想知道是否不喜欢使用自动递增的主键作为外键??
编辑
我收到错误代码#1215-无法添加外键限制
非常感谢您的帮助!

一个学生能否多次注册同一门课程?如果不行,那么我认为这个语句是错误的:PRIMARY KEY (fk_unit_id, fk_student_id, register_date),在这种情况下你只需要 PRIMARY KEY (fk_unit_id, fk_student_id) - Maximus2012
你怎么知道外键不起作用?你有收到任何错误消息吗? - Maximus2012
你可能也不需要在学生表中包含课程信息,因为单元表会处理这个问题,然后注册表通过单元将学生与课程匹配。 - Maximus2012
1
MySQL文档中关于外键的部分在使用它们作为外键之前对列进行索引,例如:INDEX (fk_course_code), FOREIGN KEY (fk_course_code) REFERENCES course(course_code)。但我不确定这是否是您问题的根源。 - The 42nd Doctor
单元表和学生表已经添加到我的MySQL数据库中,所以这不应该是个问题…除了course_code之外,所有的都是INT(4),但那个也运作得很好。我仍然认为这与ZEROFILL AUTO_INCREMENT有关。 - Kittyinsocks
显示剩余8条评论
1个回答

1

学生表和课程表的主键均配置了ZEROFILL,但是参考它们的注册表中的列却没有。外键列的属性必须与它们在外部表中所指向的列完全匹配。

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

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)
);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接