Answers:
就像你说的一样。甲FOREIGN KEY约束引用相同表通常是用于层次结构,它会使用另一列来引用主键。员工表就是一个很好的例子:
EmployeeId Int Primary Key
EmployeeName String
ManagerId Int Foreign key going back to the EmployeeId
因此,在这种情况下,有一个从表返回到自身的外键。所有经理也是雇员,因此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);
我刚刚在自己的数据库中找到了这样的外键,而且肯定是我自己创建的。我认为这只是偶然发生的。如果我在具有主键的表的上下文菜单中单击“新建外键”(在Management Studio中,SQL 2014 Express),这已经自动创建了一个引用自身的外键。见下文:
如果那时我没有意识到我应该更改那个而不是添加一个新的,它将保留在那里。或者,如果我只是单击[Close]按钮,这就像[Cancel],则在保存表定义后仍将创建外键。
因此,对我来说,这样的外键是没有意义的,可以删除。
也许设计师想禁用TRUNCATE TABLE?
TRUNCATE TABLE不能在对另一个表具有外键约束的表上使用,但是如果有自引用外键也可以使用它。从TRUNCATE TABLE(Transact-SQL)的文档中:
DELETE没有WHERE子句的语句与的作用类似TRUNCATE TABLE(删除表中的所有行),但是该DELETE语句触发删除触发器,这可能是允许的原因,DELETE但不允许这样做TRUNCATE TABLE。
我会使用权限来执行此操作(DELETE需要删除权限,TRUNCATE TABLE需要更改表权限),但是也许由于某些原因设计人员无法执行此操作?
注意:尽管设计人员所做的实际上并未禁用TRUNCATE TABLE,但我仍在推测这是他们的意图。