强制表的列成为另一个表的成员的约束是什么?

时间:2014-04-12 12:57:37

标签: sql oracle

我正在为银行设计基本数据库。我想知道为银行的每位经理添加约束的最佳方法是该银行的员工应该是什么?

到目前为止,这是数据结构:

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  );

3 个答案:

答案 0 :(得分:1)

如果您只是想确保经理是有效的员工,您可以使用简单的外键:

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#)

答案 1 :(得分:0)

您基本上在寻找外键。这里有一个鸡蛋问题。每位员工通过Employee.BSB#号码列引用银行,但每家银行都通过Bank.Manager#引用员工。

我认为您可以使用包含BankManagerBSB#列以及Manager#值的单独表MSDate做得更好。

无论如何,在大多数DBMS中,在表Employee存在之前,您无法在表Bank中创建具有FK约束的表Bank,反之亦然。因此,使用两个表设计,您可能必须创建一个没有FK约束的表,然后使用ALTER TABLE添加FK约束。

使用三种表格设计,您可以创建Bank,然后Employee,然后BankManager

答案 2 :(得分:0)

我不会把经理的东西放到银行表中,因为经理是员工。所以你有两种类型的员工,管理人员和普通员工。然后归结为泛化/专业化设计。

您可以在Employee表中添加标志(is_manager),也可以创建另一个表Manager。无论哪种情况,这家伙在银行工作的事实都是一个简单的外键。

至于标题What is the constraint to force a column of a table to be a member of another table?中的问题,我假设您引用了列的。在这种情况下,答案是:您从 another tablea table创建一个外键