2017-02-17 25 views
1

私はこの記事で他のトピックを見て、私のスクリプトをそれらに適応させようとしましたが役に立たなかった。だから私はここに投稿しています。SQL Noob。 "外部キー制約が正しく形成されていません"

私は2つのテーブル、科目と学生を持っています。これらの中には、2つの主キー(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)を含む第3のテーブルを作成しようとしています。ここで

は、私はphpMyAdminの上で実行しようとしたコードは次のとおりです。私はSQLに非常に新しいんだとして任意の助け

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

おかげで、私に簡単にアクセスしてください。

+1

よう問い合わせます。 –

+0

[tag:sql-server]タグを削除しました。 MySQLには 'AUTO_INCREMENT'という構文がありますが、Microsoft SQL Serverにはありません。 –

+0

@DanBracukによると、あなたは 'studentFirstName'、' studentLastName'、 'subjectExamBoard'、および' subject_name'を持つことによって不要な冗長性を作成しています。これらの列はすべて、結合によって取得できます。あなたはあなたのデザインを再訪したいかもしれません –

答えて

0

チェックあなたのFK制約のために、各列のペア、彼らはあなたが何をしたいのかないで同じデータ型

+0

OK、やります。どうもありがとう! – 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) 
); 

次に、あなたはあなたの名前が有効であることを仮定しCONSTRAINT name_of_constrainT FOREIGN KEY

である必要があります

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

あなたが理解していないので、私はこの本「データベース設計for Mere Mortals」について良いことを聞いたことがあります。関連するクリシェは、二度よりもうまくやるのが簡単です。 –

0

でそれを照会

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

3番目のテーブルから正確に何を達成しようとしているのかよく分かりません。しかし、目的が2つの表を一緒に表示するだけであれば、ビューを作成するだけです。

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; 
関連する問題