2016-11-28 90 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