0

外鍵我有兩個表中的PostgreSQL:創建兩個不同表

create Table student (
studentID integer primary key, 
studentname text 
); 

create Table courses (
courseID text primary key, 
schoolname text 
); 

我想創建一個第三個表schoolstudent,有一個外鍵(studentID, schoolname)其中studentID引用student表的主鍵, schoolname引用courses表中的schoolname密鑰。

如何在PostgreSQL 9.4或9.5中的兩個不同的表中創建外鍵?

回答

1

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.

如果你真的需要schoolnameschoolstudent表(我嚴重懷疑,看起來像一個設計錯誤),你可以只是添加它。爲了執行參照完整性,您可以在中包含它在外鍵中,但您也需要在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表。

+0

他們的方式,我可以使用學校名稱,而無需創建新表或它不可能?因爲我需要'學生'表中的學校名稱 –

+0

@ R.Y.H:考慮附錄。 –

+0

'有沒有一種方法,我可以使用學校名稱......這取決於「學校名稱」是否完全依賴於course_id(我們不知道,你的母親知道)。如果相同的課程可以在*多個學校*,至少*需要一張額外的桌子。(學生課程必須提及student + {course,school} – joop

0

你可以設置很多很多的關係只有在兩個領域都獨特(可能是主鍵)。如果上述條件得到滿足,你可以使用

CREATE TABLE Schoolstudent(
    ID INT references  student(studentID), 
    Schoolname CHAR(50) references courses(Schoolname), 

); 

schoolnamecourses應該獨特或PK

+0

有沒有什麼辦法可以將studentID與學校名稱結合成一個外鍵,因此它變得唯一:由於studentID是唯一的,因此外鍵(studentID,schoolname)例如,如果我們有coursename屬性,我們可以創建外鍵(courseID,coursename)參考課程(courseID,coursename)。如果兩個屬性位於不同的表中,我們可以做同樣的事情嗎? –