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
,但我仍在推测这是他们的意图。