2017-02-17 89 views
1

我已经看过这篇文章的其他主题,并试图使我的脚本适应他们,但无济于事。所以我在这里张贴。SQL Noob。 “外键约束错误地形成”

我有两张桌子,科目和学生。在这些内部,有两个主键(subject_id和student_id),请参考full view of the two tables的图像(在phpmyadmin中完成)。我想要创建第三个表,其中包含entry_id(主键),subject_id(FK),subject_name(FK),subjectexamboard(FK),student_id(FK)和studentfirstname(FK)。

这里是我试过的phpMyAdmin的运行代码:

CREATE TABLE entries3(
entry_id INT NOT NULL AUTO_INCREMENT, 
subject_id INT NOT NULL, 
subject_name VARCHAR(20) NOT NULL, 
subjectExamBoard VARCHAR(10) NOT NULL, 
student_id INT UNSIGNED NOT NULL, 
studentFirstName VARCHAR(20) NOT NULL, 
studentLastName VARCHAR(40) NOT NULL, 
PRIMARY KEY (entry_id), 
CONSTRAINT FOREIGN KEY (subject_id) REFERENCES subjects(subject_id), 
CONSTRAINT FOREIGN KEY (subject_name) REFERENCES subjects(subject_name), 
CONSTRAINT FOREIGN KEY (subjectExamBoard) REFERENCES subjects(exam_board), 
CONSTRAINT FOREIGN KEY (student_id) REFERENCES students(student_id), 
CONSTRAINT FOREIGN KEY (studentFirstName) REFERENCES students(first_name), 
CONSTRAINT FOREIGN KEY (studentLastName) REFERENCES students(last_name)); 

感谢您的帮助,请宽容我,因为我很新的SQL。

+1

上的名称的限制是不必要的,因为是列。 –

+0

我删除了[tag:sql-server]标签。 MySQL具有'AUTO_INCREMENT'语法,但Microsoft SQL Server不支持。 –

+0

正如@DanBracuk所说,你通过拥有'studentFirstName','studentLastName','subjectExamBoard'和'subject_name'来创造不必要的冗余。所有这些列可以通过连接获得。你可能想重温你的设计 –

回答

0

检查每一列对您的FK约束,他们应该是相同的数据类型

+0

好的,会做的。非常感谢! – chunkydumpling

0

也就是说你想要做什么。你想要一个查询或一个视图。

你在上面试图做什么打破任何一种database normalization

你的条目表是这样的:

CREATE TABLE entries3 (
    entry_id INT NOT NULL AUTO_INCREMENT, 
    subject_id INT NOT NULL, 
    student_id INT UNSIGNED NOT NULL, 
    PRIMARY KEY (entry_id), 
    CONSTRAINT fk_entry_subjects FOREIGN KEY (subject_id) REFERENCES subjects(subject_id), 
    CONSTRAINT fk_entry_students FOREIGN KEY (student_id) REFERENCES students(student_id) 
); 

然后你

select sub.*, stu.* 
from entries3 as ent 
    inner join subjects as sub 
    on ent.subject_id = sub.subject_id 
    inner join students as stu 
    on ent.student_id = stu.student_id 
+0

啊我明白了。我不明白,但非常感谢你的帮助。我会稍后再尝试! :) – chunkydumpling

+0

由于你不明白,我听说过这本书,数据库设计为单纯的凡人的好东西。相关的陈词滥调是,做事比做两次更容易。 –

0

查询应该是约束name_of_constrainT FOREIGN KEY

假设你的名字是有效的

CREATE TABLE entries3(
    entry_id INT NOT NULL AUTO_INCREMENT, 
    subject_id INT NOT NULL, 
    subject_name VARCHAR(20) NOT NULL, 
    subjectExamBoard VARCHAR(10) NOT NULL, 
    student_id INT UNSIGNED NOT NULL, 
    studentFirstName VARCHAR(20) NOT NULL, 
    studentLastName VARCHAR(40) NOT NULL, 
    PRIMARY KEY (entry_id), 
    CONSTRAINT subject_id_fk  FOREIGN KEY (subject_id)  REFERENCES subjects(subject_id), 
    CONSTRAINT subject_name_fk FOREIGN KEY (subject_name)  REFERENCES subjects(subject_name), 
    CONSTRAINT subjectExamBoar_fk FOREIGN KEY (subjectExamBoar) REFERENCES subjects(exam_board), 
    CONSTRAINT student_id_fk  FOREIGN KEY (student_id)  REFERENCES students(student_id), 
    CONSTRAINT studentFirstName_fk FOREIGN KEY (studentFirstName) REFERENCES students(first_name), 
    CONSTRAINT studentLastName_fk FOREIGN KEY (studentLastName) REFERENCES students(last_name)); 
+0

我明白了,感谢您的帮助。没有意识到这一点! – chunkydumpling

+0

@chunkydumpling如果我的回答是正确的,请将其标记为已接受...看到这里如何 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – scaisEdge

+0

你忘了指定FOREIGN KEY后面的列 – LONG

0

外键约束名称不能与表名称的属性相同。

0

不知道你到底想从第三个表中获得什么。但是,如果目标只是将两个表格放在一起,那么只需创建一个视图即可。

CREATE view entries3 AS 
SELECT 
su.subject_id AS 'Subject_ID', 
su.subject_name AS 'Subject_Name', 
su.subjectexamboard AS 'Subject_Exam_Board' 
st.student_id AS 'Student_ID', 
st.studentfirstname AS 'Student_First_Name' 
FROM subject su, student st; 

然后查询作为

SELECT * from entries;