【问题标题】:How to make a Foreigne key that references NOT Primary or Unique column from another table?如何从另一个表中创建一个引用 NOT Primary 或 Unique 列的外键?
【发布时间】:2013-03-18 17:19:45
【问题描述】:

我制作了具有一个主键和一个外键的经典 Employee - Employer 表。外键引用主表,所以它是一个自引用表:

CREATE TABLE Worker
(
    OIB NUMERIC(2,0),
    Name NVARCHAR(10),
    Surname NVARCHAR(20),
    DateOfEmployment DATETIME2 NOT NULL,
    Adress NVARCHAR(20),
    City NVARCHAR(10),
    SUPERIOR NUMERIC(2,0) UNIQUE,
    Constraint PK_Worker PRIMARY KEY(OIB),
    CONSTRAINT FK_Worker FOREIGN KEY (Superior) REFERENCES Worker(OIB)
);

应该为我的所有员工保留积分的第二张表是这样制作的:

CREATE TABLE Point
(
    OIB_Worker NUMERIC(2,0) NOT NULL,
    OIB_Superior NUMERIC(2,0) NOT NULL,
    Pt_To_Worker tinyint,
    Pt_To_Superior tinyint,
    Month_ INT NOT NULL,
    Year_ INT NOT NULL,
    CONSTRAINT FK_Point_Worker FOREIGN KEY (OIB_Worker) References Worker(OIB),
    CONSTRAINT FK_Point_Worker_2 FOREIGN KEY (OIB_Superior) References Worker(Superior),
    CONSTRAINT PK_Point PRIMARY KEY(OIB_Worker,OIB_Superior,Month_,Year_)
);

它应该能够为每个员工每月存储成绩。 也就是说,我有两个外键,一个用于 Worker.OIB,一个用于 Worker.Superior。另外,我有一个由 Point.OIB_Worker、Point.OIB_superior、Point.Month_ 和 Point.Year_ 列组成的复合主键。键是复合的,因为它需要禁用输入成绩超过每月一次。

我的问题是:

如何制作从Point到Worker的外键,以便任何上级可以分配一个以上的员工?

如果您仔细观察,我的实施是可行的,但每位经理只能有一名员工。 这是因为外键必须引用其他表中的主列或唯一列。而且我的 Worker.Superior 是唯一的,所以它只能有唯一的值(没有重复)。

我想很多人会觉得这个例子很有趣,因为它是创建新数据库时的常见问题。

【问题讨论】:

  • 你为什么要让 Worker.Superior UNIQUE?
  • 为什么需要Point.OIB_Superior 列?加入Worker就可以得到上级,这不是多余的吗?
  • @GilM 好吧,正如它在文本中所说,对于一个列作为不同表中其他列的外键,引用的列必须是唯一的或主要的
  • @MichaelLiu 我必须只为监督员工的适当经理启用一次输入成绩
  • 我认为您的 FK_Point_Worker_2 也应该有 References Worker(OIB),并且您应该从 Worker.Superior 中删除 UNIQUE 约束。这样一来,上级就可以为他分配多个工人。

标签: tsql ssms foreign-key-relationship


【解决方案1】:

我认为您的 FK_Point_Worker_2 也应该有 References Worker(OIB),并且您应该从 Worker.Superior 中删除 UNIQUE 约束。这样一来,上级就可以有多个工人分配给他。

【讨论】:

    【解决方案2】:

    考虑一下。您对 SUPERIOR 有独特的约束,您对为什么两个员工不能拥有相同的 SUPERIOR 感到困惑。这就是唯一约束所做的 - 不允许重复。

    FK 只能引用一个或多个唯一列。

    带有 References Worker (OIB) 的 FK_Point_Worker_2 并不能保证 OIB 是一个上级。

    我会在 (OIB, SUPERIOR)
    上为 Worker 添加一个唯一约束 并删除对 SUPERIOR 的唯一约束。
    它永远是独一无二的,因为 OIB 是独一无二的。 然后有复合FK关系。

    这是一个复合外键关系的例子

    ALTER TABLE [dbo].[wfBchFolder]  WITH CHECK ADD  CONSTRAINT [FK_wfBchFolder_wfBch] FOREIGN KEY([wfID], [bchID])
    REFERENCES [dbo].[WFbch] ([wfID], [ID])
    GO
    

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2011-01-11
      • 1970-01-01
      相关资源
      最近更新 更多