2013-02-04 32 views
1

當我嘗試在MySQL中創建表時,出現了一個奇怪的問題。交叉引用的外鍵約束錯誤

我想有一個跨兩個參考多到多個表,這裏是我的代碼創建表

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 

執行代碼我一個m得到例外

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

我的問題是,爲什麼順序很重要?這兩種創建約束的方式有什麼區別?謝謝

回答

0

「我嘗試以這樣的不同順序執行代碼」你有沒有不同的順序,你有不同的約束。你不能創建這樣的約束。 檢查本文的詳細信息

FOREIGN KEY Constraints

0

你的一些外鍵似乎並沒有任何意義。

那些引用studentteacherfk_teacher_studentfk_student_teacher的)都很好。這實際上是一個多對多表引用實現多對多關係的兩個實體表中的每一個的典型案例。

現在,你提議從這些表格引用多對多的表格到底是什麼?我承認,我無法真正解釋爲什麼使用第一個腳本成功添加外鍵,而另一個失敗。對於那個很抱歉。儘管我有一些模糊的想法,但這並不是我的答案。問題是,你現在的設計會讓你很難添加新的數據。有了它,你不可能真的增加一個學生,也不會增加新學生和現有教師之間的關係。這是因爲student中的一行應該引用teacher_student中的現有學生,但由於它是新學生,因此teacher_student中沒有相應的行。新老師也一樣。

因此,考慮放棄fk_student_teacher_studentfk_teacher_teacher_student的想法。他們不需要你的設計。他們已經讓你解決了一個不必要的問題,並且他們很可能會在未來造成更多麻煩。