2017-04-24 149 views
0

我做一个评估和任务之一,要求我们MySQL错误1215 - 不能添加外键约束

创建和使用查询脚本再次填充第三个表叫条目。此表应包含外键,以便与其他两个表进行合理的链接,与

在请求中提到的两个表格是通过这些

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

创建的每个考试的日期一起和

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 entries(
subject_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
subject_name VARCHAR(20) NOT NULL, 
level_of_entry VARCHAR(10) NOT NULL 
exam_board VARCHAR(10) NOT NULL, 
date_of_exam DATETIME NOT NULL, 
PRIMARY KEY (date_of_exam), 
FOREIGN KEY (subject_id) REFERENCES subjects(subject_id), 
FOREIGN KEY (subject_name) REFERENCES subjects(subject_name) 
); 

但是就像上面提到的,我得到“ERROR 1215(HY000):无法提前添加外键约束

感谢您的帮助

+0

关于哪个表脚本出错? –

+0

错误的条目表脚本(问题的最后一个脚本) –

+0

我想从表学生和条目获取两个外键与条目表链接 –

回答

0

虽然蒂姆的答案是正确的,但我会建议你在条目表中根本没有subject_name列。你可以随时从主题表中获得它。 但还是如果你想保持subjects_name列条目表,并希望在受试者表

alter table `subjects` add unique (`subject_name`); 

加上subjects_name列外键约束,则任何声明subjects_name作为唯一的列或创建对象上subjects_name列的索引表。

alter table `subjects` add index subject_name_index(`subject_name`); 

然后创建Entries表。

+0

好的,谢谢!我会试试这个 –

0

这是导致行!问题:

FOREIGN KEY (subject_name) REFERENCES subjects(subject_name) 

的原因,它造成的问题是,因为subject_name不在subjects表的主键列有。有很多方法可以解决这个问题。我可能会使用的方法是将刚落这个坏外键的定义,即用这个定义entries:如果你想确保给定subject_id将始终以独特subject_namesubjects相关

CREATE TABLE IF NOT EXISTS entries(
    subject_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    subject_name VARCHAR(20) NOT NULL, 
    level_of_entry VARCHAR(10) NOT NULL 
    exam_board VARCHAR(10) NOT NULL, 
    date_of_exam DATETIME NOT NULL, 
    PRIMARY KEY (date_of_exam), 
    FOREIGN KEY (subject_id) REFERENCES subjects(subject_id) 
) 

表,你可以做到这一点通过使subject_name列独特:

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

然后,给定subject_name只能与最多一个subject_id相关。

0

首先,您的条目表的目的是什么? 主题和条目看起来不差

其次,从来没有使用DATETIME作为主键

尝试此查询:

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

+0

这没有奏效,我得到了同样的错误。 –