2016-11-28 89 views
0

在詢問包括本網站上的這個問題之前,我已經徹底研究過了。使用外鍵創建mysql表時出錯

我有一個學生表:

CREATE TABLE IF NOT EXISTS students(
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
first_name VARCHAR(20) NOT NULL, 
middle_name VARCHAR(20), 
last_name VARCHAR(40) NOT NULL, 
email VARCHAR(60) NOT NULL, 
password CHAR(40) NOT NULL, 
reg_date DATETIME NOT NULL, 
PRIMARY KEY (student_id), 
UNIQUE (email)); 

我也有一個主題表:

CREATE TABLE IF NOT EXISTS subjects(
subject_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
subject_name VARCHAR(40) NOT NULL, 
level_of_entry VARCHAR(20) NOT NULL, 
exam_board VARCHAR(20) NOT NULL, 
PRIMARY KEY (subject_id)); 

我現在創建一個錶鏈接上面的表格:

CREATE TABLE IF NOT EXISTS entries(
exam_date DATETIME NOT NULL, 
FOREIGN KEY (student_id) REFERENCES students (student_id), 
FOREIGN KEY (subject_id) REFERENCES subjects (subject_id) 
); 

我的問題是,當我嘗試在第三個表中聲明外鍵時,我得到一個錯誤,指出s ubject_id外鍵不在引用的表中。 錯誤1072(42000):表格中不存在鍵列'student_id',即使它明確包含在學生表內,同樣適用於'subject_id'和主題表。 我確定我的聲明外鍵的語法是正確的,所以我不確定如何解決這個問題。 所有幫助表示讚賞。謝謝。

+0

我想你忘了在'entries'表中添加'student_id'和'subject_id'列。現在,'entries'表只有一列'exam_date'。你試圖在一個不存在的列上的這個'entries'表中映射一個外鍵,這個列沒有被定義 – Delphine

+0

@Delphine所以我需要像在創建student_id和subject_id列一樣,兩張桌子? – MMM

+0

沒錯。外鍵訂單不會創建列。您必須創建它並在應用外部約束之後。要小心數據類型和長度,但是,如果你按照你的方式和主題聲明瞭這兩列,那將是完美的! PS:我發佈它作爲答案 – Delphine

回答

2

你忘了你的應用外鍵約束之前創建這兩列:

CREATE TABLE IF NOT EXISTS entries(
exam_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
student_id INT UNSIGNED NOT NULL, 
subject_id INT UNSIGNED NOT NULL, 
exam_date DATETIME NOT NULL, 
PRIMARY KEY (exam_id), 
FOREIGN KEY (student_id) REFERENCES students (student_id), 
FOREIGN KEY (subject_id) REFERENCES subjects (subject_id) 
); 

編輯:

我建議你在每個表中添加一個唯一的ID列(在這裏:exam_id)。

+0

在哪一列? – Delphine

+0

我收到一個錯誤,說'不正確的表定義;只能有一個自動列定義,它必須被定義爲一個鍵' – MMM

+0

我剛剛更新了我的答案,你可以試試這個嗎? (刪除條目表,如果它已經存在) – Delphine