1

MySQL でテーブルを作成しようとしたときに奇妙な問題が発生しました。

2 つの多対多テーブルを相互参照したいのですが、テーブルを作成するコードは次のとおりです。

create table teacher(
t_id char(10) not null unique, 
name varchar(20) not null, 
sur_name varchar(20) not null, 
CONSTRAINT pk_teacher PRIMARY KEY(t_id))

create table student(
s_id char(10) not null unique,
name varchar(20) not null,
sur_name varchar(20) not null,
CONSTRAINT pk_student PRIMARY KEY(s_id))

create table teacher_student(
t_id char(10) not null,
s_id char(10) not null,
CONSTRAINT pk_teacher_student PRIMARY KEY(t_id, s_id))

外部制約を追加するために、次のコードを使用しました

ALTER TABLE teacher_student 
ADD CONSTRAINT fk_teacher_student FOREIGN KEY(s_id) REFERENCES student(s_id)
ALTER TABLE teacher_student 
ADD CONSTRAINT fk_student_teacher FOREIGN KEY(t_id) REFERENCES teacher(t_id)
ALTER TABLE student 
ADD CONSTRAINT fk_student_teacher_student 
FOREIGN KEY(s_id) REFERENCES teacher_student(s_id)
ALTER TABLE teacher 
ADD CONSTRAINT fk_teacher_teacher_student
FOREIGN KEY(t_id) REFERENCES teacher_student(t_id)

それはうまくいきますが、このように別の順序でコードを実行しようとすると

ALTER TABLE student 
ADD CONSTRAINT fk_student_teacher_student 
FOREIGN KEY(s_id) REFERENCES teacher_student(s_id)
ALTER TABLE teacher 
ADD CONSTRAINT fk_teacher_teacher_student
FOREIGN KEY(t_id) REFERENCES teacher_student(t_id)
ALTER TABLE teacher_student 
ADD CONSTRAINT fk_teacher_student FOREIGN KEY(s_id) REFERENCES student(s_id)
ALTER TABLE teacher_student 
ADD CONSTRAINT fk_student_teacher FOREIGN KEY(t_id) REFERENCES teacher(t_id)
ALTER TABLE student

例外が発生しています

Can't create table 'test.#sql-44c_37' (errno: 150)

私の質問は、なぜ順序が重要なのですか? 制約を作成するこれら 2 つの方法の違いは何ですか? ありがとう

4

2 に答える 2

0

外部キーの一部が意味をなさないようです。

studentand teacher(the fk_teacher_studentand fk_student_teacherones) を参照しているものは問題ありません。これは実際には、多対多の関係が実装されている 2 つのエンティティ テーブルのそれぞれを参照する多対多テーブルの典型的なケースです。

では、これらのテーブルから多対多テーブルへの逆参照で何を提案していますか? 最初のスクリプトを使用して外部キーが正常に追加され、他のスクリプトでは失敗した理由を説明できないことは認めます。申し訳ありません。漠然とした考えがありますが、それは私の答えのポイントではありません。重要なのは、現在の設計では、新しいデータを追加するのが難しくなるということです。これを使用すると、たとえば、新しい生徒と既存の教師との関係も追加せずに生徒を実際に追加することはできません。これは、 の行がstudentの既存の学生を参照することになっているteacher_studentためですが、それは新しい学生であるため、 にはteacher_studentまだ対応する行がありません。新しい先生も同じです。

したがって、 と のアイデアを放棄することを検討しfk_student_teacher_studentfk_teacher_teacher_studentください。これらは設計には必要ありません。彼らはすでにあなたに不必要な問題を解決させており、将来さらに問題を引き起こす可能性があります.

于 2013-02-05T07:17:07.893 に答える
0

「このように別の順序でコードを実行しようとしています」 異なる順序はなく、非常に異なる制約があります。そのような制約を作成することはできません。詳細については、この記事を調べてください

FOREIGN KEY 制約

于 2013-02-04T08:19:37.670 に答える