FK約束需要在目標列上有一個UNIQUE或PK約束,這顯然不能提供。您需要每個學校有獨特行的另一個表格:
CREATE TABLE school(
school_id serial PRIMARY KEY,
schoolname text NOT NULL
);
CREATE TABLE student(
student_id serial PRIMARY KEY,
studentname text
);
CREATE TABLE schoolstudent(
school_id int REFERENCES school,
student_id int REFERENCES student,
PRIMARY KEY (school_id, student_id)
);
CREATE TABLE course(
course_id text PRIMARY KEY,
school_id int REFERENCES school
);
對外鍵約束使用短語法。 Details in the manual.
如果你真的需要schoolname
在schoolstudent
表(我嚴重懷疑,看起來像一個設計錯誤),你可以只是添加它。爲了執行參照完整性,您可以在中包含它在外鍵中,但您也需要在school(school_id, schoolname)
上的(冗餘)匹配UNIQUE
約束。
CREATE TABLE schoolstudent(
school_id int,
student_id int REFERENCES student,
schoolname text,
PRIMARY KEY (school_id, student_id),
CONSTRAINT schoolstudent_combo_fk FOREIGN KEY (school_id, schoolname)
REFERENCES school (school_id, schoolname) ON UPDATE CASCADE
);
在這種情況下使用顯式語法。我建議級聯更新。
或者如果schoolname
實際上是保證UNIQUE
(同樣,我的疑惑),你可以完全替代school_id
,只使用schoolname
作爲PK和FK列。儘管如此,長text
列對於這個目的效率不是很高 - 如果性能很重要的話。學校名稱發生變化,這對於PK專欄並不理想。
無論如何你仍然需要單獨的school
表。
他們的方式,我可以使用學校名稱,而無需創建新表或它不可能?因爲我需要'學生'表中的學校名稱 –
@ R.Y.H:考慮附錄。 –
'有沒有一種方法,我可以使用學校名稱......這取決於「學校名稱」是否完全依賴於course_id(我們不知道,你的母親知道)。如果相同的課程可以在*多個學校*,至少*需要一張額外的桌子。(學生課程必須提及student + {course,school} – joop