【发布时间】: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)我不知道这是否是您问题的根源。