2015-04-23 93 views
3

我在添加一些外鍵約束到我的MySQL數據庫時遇到問題。例如,在本註冊表(用於記錄學生出席情況的考勤註冊表)中,我希望將fk_unit_id和fk_student_id作爲外鍵,引用Unit和Student中的主鍵。MySQL數據庫無法添加外鍵

註冊表:

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

對於R ecord,fk_course_code可以和VARCHAR(4)的Course(course_code)一起工作,所以我想知道是否它不喜歡使用auto_increated主鍵作爲外鍵?

編輯

我收到錯誤代碼#1215 - 不能添加外鍵約束

任何幫助將非常感激!

+0

mysql一般不關心字段是什麼類型。您幾乎可以將任何字段用作外鍵,但兩個表中的字段定義必須幾乎完全相同。例如您可以將'unsigned int'鏈接到'unsigned int',但不能將'int'鏈接到'bigint'或'varchar'鏈接到'text'。關於唯一的例外是子表中的字段可以爲空,即使父字段爲「非空」。 –

+0

一名學生可以多次註冊同一個單位嗎?如果沒有,那麼我不認爲這是正確的:在這種情況下,'PRIMARY KEY(fk_unit_id,fk_student_id,register_date)''你只需要'PRIMARY KEY(fk_unit_id,fk_student_id)'。 – Maximus2012

+0

你怎麼知道外鍵是不是工作?是否有任何錯誤消息,你得到? – Maximus2012

回答

1

學生和單位表中的兩個主鍵都使用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) 
); 

還有其他的優化和修改,我建議,但它們超出張貼的問題的範圍。