【发布时间】:2017-02-28 14:46:36
【问题描述】:
在 SQL Server 2012 中,我有一个带有自引用外键的表,该表引用了一个主键列,该列是一个 Identity 列。你能告诉我如何插入外键引用同一行的主键的行吗?
Create Table MyTable
(
PersonID int primary key Identity(1,1),
PersonName varchar(20) not null,
HeadofPersonID int not null references MyTable(PersonID)
)
我需要插入的行:
1, 'Mickey Mouse', 1
在这种情况下,米奇拥有身份生成的主键1,而米奇也是他自己(可能还有其他人)的负责人。我需要在插入语句的外键中提及什么?
【问题讨论】:
-
在这种情况下,如果它是根/父级,那么您通常会将其设置为
null以表示它是顶级,但不确定这是否会打破约束 -
这不是典型的用例。通常外键列可以为空,因此在 PersonID 和 HeadofPersonID 相同的情况下,您可以将 NULL 插入 HeadofPersonID 列。
-
我不认为这可以做到,更好的解决方案是为米老鼠设置两条记录 - 一条在头部位置,一条在员工位置
-
不行,对不起。该记录在创建之前无法引用自身,但由于您的外键不为空,因此无法在没有引用记录的情况下创建它......这是一个问题 22。您最好的选择是允许外键列中的空值。
-
是的,您绝对不想破解您的方式来强制获取这些数据。显而易见的下一步将是构建树的递归 cte,如果您有一行引用自身,则不能使用递归,因为这将是一个无限循环。
标签: sql sql-server