为什么表将其主键用作自身的外键

Aar*_*nus 25 foreign-key sql-server primary-key

查看数据库,我遇到了一个表,该表使用其主键作为其自身的外键。

我已经看到一个表可以有一个自身的外键来构建层次结构,但它会使用另一列来引用主键。

由于主键是唯一的,在这种情况下,该行不是只能指向自身吗?这似乎是一个同义反复的链接,因为如果我已经有了该行,那么我已经有了该行。

有什么理由这样做吗?

连接到自身的表

我确信约束是这样写的(不仅仅是查看图表),因为相同的表和列用于定义的两半。

Ken*_*her 32

就如你所说的。甲FOREIGN KEY约束引用相同表通常是用于层次结构,它会使用另一列来引用主键。一个很好的例子是员工表:

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,表中有一个外键返回到它本身。所有经理也是员工,所以ManagerId实际上EmployeeId是经理的。

现在另一方面,如果您的意思是有人将EmployeeId用作返回 Employee 表的外键,那么这可能是一个错误。我确实运行了一个测试,这是可能的,但它没有任何实际用途。

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);
Run Code Online (Sandbox Code Playgroud)


小智 6

我刚刚在我自己的数据库中发现了这样一个外键,它一定是我自己创建的。我认为这只是偶然发生的。如果我在带有主键的表(在 Management Studio 中,SQL 2014 Express 中)的上下文菜单中单击“新外键”,这已经自动创建了这样一个引用自身的外键。见下文:

在此处输入图片说明

如果我当时没有意识到我应该改变那个而不是添加一个新的,它就会留在那里。或者,如果我只是单击 [Close] 按钮,这意味着这将类似于 [Cancel],则在保存表定义后仍会创建外键。

所以,对我来说,这样的外键没有意义,可以删除。