2017-10-09 51 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。 。 。这可能是一个风格问题,但我喜欢在所有表中都有一个唯一的主键。对于这个表格尤其如此,因为我可能会希望另一个表格指的是行 - 例如表格中有一个员工安排在分支机构或他/她在那里工作的小时数。 –