我制作了一个主键和一个外键的经典雇员-雇主表.外键引用主要,因此它是一个自引用表:
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_列组成的复合主键。Key是复合的,因为它需要禁用每月一次以上的输入等级。
我的问题是:
如何使外键从一个点到另一个工人,以便任何上级都可以有一个以上的员工分配给他?
如果仔细观察,我的实现可以工作,但每个经理只能有一个雇员。这是因为外键必须引用其他表中的主列或唯一列。而且我的Worker.Superior是唯一的,所以它只能有唯一的值(不重复)。
我想很多人会觉得这个例子很有趣,因为在创建一个新的数据库时,它是一个常见的问题。
发布于 2013-03-18 18:47:15
我认为您的FK_Point_Worker_2也应该有References (OIB),并且您应该从Worker.Superior中删除唯一的约束。这样,上级就可以指派一个以上的工人给他。
发布于 2013-03-18 19:21:38
想想看。你对上司有着独特的约束,你对为什么两个员工不能拥有同一个上级感到困惑。这就是唯一约束所做的--不允许重复。
FK只能引用一个或多个列。
具有引用工作者( OIB )的FK_Point_Worker_2并不能保证OIB是高级的。
我会增加一个唯一的限制工人(OIB,上级)
并取消对上级的唯一约束。
它将永远是独一无二的,因为OIB是独一无二的。然后有复合FK关系。
这是复合FK关系的一个示例。
ALTER TABLE [dbo].[wfBchFolder] WITH CHECK ADD CONSTRAINT [FK_wfBchFolder_wfBch] FOREIGN KEY([wfID], [bchID])
REFERENCES [dbo].[WFbch] ([wfID], [ID])
GOhttps://stackoverflow.com/questions/15482958
复制相似问题