【问题标题】:Creating a table where the primary key will be from two different table oracle 11g创建一个表,其中主键将来自两个不同的表 oracle 11g
【发布时间】:2021-08-23 07:01:10
【问题描述】:

我有 3 张桌子。架构如下:

员工(NID、姓名、薪水、职务、电话、分支机构)

客户(NID、姓名、Insurance_type、电话、地址、is_active、Pay_per_month、Start_year、End_year)

付款(NID、应付、应收)

支付表的主键是 NID,它继承自 Employee 和 Client 表。如果我们合并 Employee 和 Client 表中的 NID 列,所有 NID 将是唯一的。有没有办法制作这样的表,其中 NID 将从 oracle 11g 中的客户端和员工表中继承?

【问题讨论】:

  • 如果nidpayment 的主键,则意味着employeeclient 最多只能有1 次付款。这似乎真的不太可能。也许您的意思是您希望 nid 成为外键并拥有一个单独的 payment_id 作为主键?
  • 员工和客户最多只能获得 1 笔付款。此表的目的是检查任何具有 nid x 的特定人员是否有任何到期或应收款项。整个数据库中的每个 nid 都是唯一的。

标签: database oracle11g


【解决方案1】:

这看起来不像一个可行的设计。

执行此操作的标准方法是在 PAYMENT 表中为每个父级设置一个单独的外键,即:

Payment (NID, NID_Client, NID_Emp, Payable, Receivable)

其中 NID - PAYMENT 表的唯一键

NID_Client 是 Client.NID 值

NID_Emp 是 Employee.NID 值

添加 FK 约束:

alter table payment ADD CONSTRAINT FK_Payment_Emp
    FOREIGN KEY (NID_Emp) REFERENCES Employee(NID);

alter table payment ADD CONSTRAINT FK_Payment_Client
    FOREIGN KEY (NID_Client) REFERENCES Client(NID);

【讨论】:

  • 整个数据库中的每个 NID 都是唯一的。还是不能合并?
  • 没有。好吧,你可以有 Payment NID = Emp NID ||客户端 NID,然后依靠复杂的编码来提取每个组件的值,但它是一个过度设计和片状的解决方案,它确实是一个真正在脑海中的问题。它不能通过开箱即用的 FK 机制强制执行,因此您必须自己构建。我认为它没有任何好处,除了它是一个有趣的技术练习。
猜你喜欢
  • 1970-01-01
  • 2016-10-23
  • 2012-09-27
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2023-03-15
相关资源
最近更新 更多