Tsql 如何生成引用其他表中非主列或唯一列的外键?

Tsql 如何生成引用其他表中非主列或唯一列的外键?,tsql,ssms,foreign-key-relationship,Tsql,Ssms,Foreign Key Relationship,我制作了一个经典的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), SUPER

我制作了一个经典的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列组成的复合主键。键是复合键,因为它需要禁用每月输入一次以上的分数

我的问题是:

如何从一个点到另一个点制作外键,以便任何上级都可以指派多个员工?

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


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

我认为您的FK_Point_Worker_2也应该有引用Worker(OIB),并且您应该从Worker.Superior中删除唯一约束。这样,上级可以指派多个工人

想想看。你对上司有着独特的约束,你对为什么两个员工不能拥有同一个上司感到困惑。这就是唯一约束所不允许的——不允许重复

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

具有参考工作人员(OIB)的FK_Point_Worker_2不能保证OIB是上级

我会在(OIB,上级)上添加对工人的唯一约束
并删除对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

为什么要使Worker.Superior独一无二?为什么需要
Point.OIB_Superior
列?这难道不是多余的吗?因为你可以通过加入
Worker
?@GilM来获得上级。正如文中所说,一列作为另一个表中其他列的外键,引用的列必须是唯一的或唯一的primary@MichaelLiu我必须只允许为监督员工的适当经理输入一次等级。我认为您的FK_Point_Worker_2也应该有参考员工(OIB),并且您应该从Worker.Superior中删除唯一约束。这样,上级可以指派多个工人。