2017-10-09 52 views
0

比方說,銀行的模式如下:SQL:如何使參與約束在一個表中

Employee = {*ID*,salary} 
Branch = {*BranchNum*, Location} 

如果關係既有參與約束和鍵約束:

Employee ==> workAt -- Branch //every employee must work at one branch 

我可以強制一個參與約束,通過設置BranchNumNOT NULL

CREATE TABLE employee (
    ID   INTEGER, 
    BranchNum INTEGER  NOT NULL, 
    PRIMARY KEY (ID) 
    FOREIGN KEY (ID) REFERENCES Employee 
    FOREIGN KEY (BranchNum) REFERENCES Branch 
) 

然而,如果只有參與約束,但無鍵約束:

Employee === workAt -- Branch //every employee must work at one or some branches 

如何把參與約束創建表時?

回答

1

如果你想:

//每一位員工都必須在一個或一些分支

工作,那麼你有一個1-n的關係。你可以使用結點表來實現它:

CREATE TABLE EmployeeBranches (
    EmployeeBranchId INTEGER AUTO_INCREMENT PRIMARY KEY, 
    EmployeeID INTEGER NOT NULL, 
    BranchNum INTEGER NOT NULL, 
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeId) 
    FOREIGN KEY (BranchNum) REFERENCES Branch(BranchNum) 
); 
+0

'EmployeeBranchId'是不必要的。 '(EmployeeID,BranchNum)'上需要一個唯一的鍵。您也沒有處理員工必須在至少一個分支工作的要求,這需要從Employee.EmployeeId到EmployeeBranches.EmployeeId的附加FK約束。這樣做並不流行,因爲它需要使用延遲約束檢查進行填充的事務,但OP應該知道如果需要可以強制執行。 – reaanb

+0

@reaanb。 。 。這可能是一個風格問題,但我喜歡在所有表中都有一個唯一的主鍵。對於這個表格尤其如此,因爲我可能會希望另一個表格指的是行 - 例如表格中有一個員工安排在分支機構或他/她在那裏工作的小時數。 –