我制作了具有一个主键和一个外键的经典 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 是唯一的,所以它只能有唯一的值(没有重复)。
我想很多人会觉得这个例子很有趣,因为它是创建新数据库时的常见问题。