如何创建从另一个表引用NOT Primary或​​Unique列的外键?

时间:2013-03-18 17:19:46

标签: tsql ssms foreign-key-relationship

我制作了经典的Employee - Employer表,它有一个主键和一个外键。外键引用为primary,因此它是一个自引用表:

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 to Worker创建一个外键,以便任何上级可以为他分配多于一名的员工?

如果仔细观察,我的实施工作正常,但每个经理只能有一名员工。 这是因为外键必须引用其他表中的主列或唯一列。而我的Worker.Superior是独一无二的,所以它只能有唯一的值(不重复)。

我认为很多人会发现这个例子很有趣,因为这是制作新数据库时常见的问题。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

想一想。你对SUPERIOR有独特的限制,你很困惑为什么两个员工不能拥有相同的SUPERIOR。这就是一个独特的约束 - 不允许重复。

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

带有参考工作人员(OIB)的FK_Point_Worker_2并不能保证OIB是高级人员。

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

这是复合FK关系的一个例子

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