【问题标题】:How to Insert a Row to a self-referential table with the same primary and foreign key?如何将行插入到具有相同主键和外键的自引用表中?
【发布时间】: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


【解决方案1】:

从您的外键列声明中删除 not nullconstraint 并在 HeadofPersonID 中插入 NULL 作为您的层次结构的负责人:

Create Table MyTable
(
    PersonID int primary key Identity(1,1),
    PersonName varchar(20) not null,
    HeadofPersonID int references MyTable(PersonID)
)

【讨论】:

  • 有了这个,您可以使用where HeadofPersonID is null 来查找根。如果您想强制使用单个根,您可以使用唯一索引:CREATE UNIQUE INDEX UK_MyTable_SingleRoot ON dbo.MyTable(HeadofPersonID) WHERE key IS NULL;
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多