我正在为银行设计一个基本的数据库。我想知道什么是增加约束的最好方式,因为一家银行的每个经理都应该是该银行的雇员?
以下是目前为止的数据结构:
SQL> CREATE TABLE Employee (
2 BSB# CHAR(6), /* Bank BSB number */
3 E# CHAR(5) NOT NULL, /* Employee number */
4 Name VARCHAR2(30) NOT NULL, /* Employee name */
5 DOB Date, /* Date of birth */
6 Address VARCHAR2(50), /* Home address */
7 Sex CHAR, /* M-Male, F-Female */
8 Salary NUMBER(7,2), /* Salary */
9 Supervisor# CHAR(5), /* Supervisor number */
10 CONSTRAINT Employee_PK PRIMARY KEY(BSB#, E#),
11 CONSTRAINT Employee_FK1 FOREIGN KEY (BSB#, Supervisor#) REFERENCES Employee(BSB#, E#),
12 CONSTRAINT Employee_FK2 FOREIGN KEY (BSB#) REFERENCES Bank (BSB#)
13 );
CREATE TABLE Bank (
2 BSB# CHAR(6) NOT NULL, /* Bank BSB number */
3 Name VARCHAR2(40) NOT NULL, /* Bank name */
4 Address VARCHAR2(50) NOT NULL, /* Bank location */
5 Manager# CHAR(5) NOT NULL, /* Department manager number */
6 MSDate DATE, /* Manager start date */
7 Phone# VARCHAR2(15) NOT NULL, /* Contact phone number */
8 CONSTRAINT Bank_PK PRIMARY KEY(BSB#),
9 CONSTRAINT Bank_CK1 UNIQUE(Name)
10 );发布于 2014-04-12 13:15:38
如果您只是想确保经理是有效的员工,可以使用一个简单的外键:
ALTER TABLE bank
ADD CONSTRAINT bank_manager_fk
FOREIGN KEY (manager#) REFERENCES employee(e#)如果您想确保银行经理确实是的雇员同一家银行的,那么您需要一个更高级的外键:
ALTER TABLE bank
ADD CONSTRAINT bank_manager_fk
FOREIGN KEY (manager#, bsb#) REFERENCES employee(e#, bsb#)发布于 2014-04-12 13:20:30
你基本上是在找外键。这里有鸡和蛋的问题。每个员工通过Employee.BSB#编号列表示一家银行,但每一家银行通过Bank.Manager#表示一名员工。
我认为,如果单独的表BankManager包含一个BSB#和Manager#列,再加上MSDate值,您可能会做得更好。
无论如何,在大多数DBMS中,在表Employee存在之前,不能创建表Bank受FK约束的表Bank,反之亦然。因此,对于两个表的设计,您可能需要创建一个没有FK约束的表,然后用ALTER添加FK约束。
通过三个表的设计,您可以创建Bank,然后创建Employee,然后创建BankManager。
发布于 2014-04-12 13:20:43
我不会把经理的东西放在银行的桌子上,因为经理是雇员。所以你有两种类型的员工,管理层和正规员工。然后,这归结为泛化/专业化设计。
可以在员工表中添加标志(is_manager),也可以创建另一个表管理器。在这两种情况下,这个家伙在银行工作的事实就是一个简单的外键。
至于标题What is the constraint to force a column of a table to be a member of another table?中的问题,我假设您引用了列的值。在这种情况下,答案是:创建一个从another table到a table的外键。
https://stackoverflow.com/questions/23030692
复制相似问题