首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制一个表的列成为另一个表的成员的约束是什么?

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

Stack Overflow用户
提问于 2014-04-12 12:57:37
回答 3查看 70关注 0票数 1

我正在为银行设计一个基本的数据库。我想知道什么是增加约束的最好方式,因为一家银行的每个经理都应该是该银行的雇员?

以下是目前为止的数据结构:

代码语言:javascript
复制
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  );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-12 13:15:38

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

代码语言:javascript
复制
ALTER TABLE bank 
ADD CONSTRAINT bank_manager_fk 
FOREIGN KEY (manager#) REFERENCES employee(e#)

如果您想确保银行经理确实是的雇员同一家银行的,那么您需要一个更高级的外键:

代码语言:javascript
复制
ALTER TABLE bank 
ADD CONSTRAINT bank_manager_fk 
FOREIGN KEY (manager#, bsb#) REFERENCES employee(e#, bsb#)
票数 1
EN

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 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 tablea table的外键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23030692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档