SQL 服务器 "NOT Allow" 是否有多个根?
Does SQL Server "NOT Allow" multiple roots?
我是 HierarchyId 世界的新手,正在尝试将 HierarchyId() 实现到我的 SQL 服务器设计中,我的印象是 SQL 服务器每个 [= 每个列只允许一个根节点27=] 如果 table 已经有一个 Root 节点,如果我尝试执行类似下面的操作,那么它应该会出错或抛出一些警告:
INSERT INTO dbo.TeamHierarchy
( TeamNode, TeamId, TeamNodeName )
VALUES ( HierarchyId::GetRoot(), -- TeamNode - hierarchyid
1, -- TeamId - int
'TeamContainer' -- TeamNodeName - varchar(50)
)
我的假设是基于我阅读的一些主题:
SQL 2008 HierarchyID with Multiple Root Nodes
但是,似乎 SQL 服务器在拥有多个根时没有任何问题,因为上面的插入查询在没有任何 errors/warning 的情况下工作得很好。自从我使用 SQL Server 2012 以来,自 SQL server 2008 以来有什么变化吗?还是我这边有什么误会?
与任何其他非主键列一样,如果值不受约束,您可以在一个列中有多个值。 HierarchyID 也不例外。如果 HierarchyID 不是主键,您的用例可以有多个根。但是如果要约束Node,需要把HierarchyID做成Primary Key,那么root只能有1个,root下有很多节点。
Microsoft 在此处讨论如何强制执行唯一性:
https://technet.microsoft.com/en-us/library/Bb677212(v=SQL.105).aspx
我是 HierarchyId 世界的新手,正在尝试将 HierarchyId() 实现到我的 SQL 服务器设计中,我的印象是 SQL 服务器每个 [= 每个列只允许一个根节点27=] 如果 table 已经有一个 Root 节点,如果我尝试执行类似下面的操作,那么它应该会出错或抛出一些警告:
INSERT INTO dbo.TeamHierarchy
( TeamNode, TeamId, TeamNodeName )
VALUES ( HierarchyId::GetRoot(), -- TeamNode - hierarchyid
1, -- TeamId - int
'TeamContainer' -- TeamNodeName - varchar(50)
)
我的假设是基于我阅读的一些主题:
SQL 2008 HierarchyID with Multiple Root Nodes
但是,似乎 SQL 服务器在拥有多个根时没有任何问题,因为上面的插入查询在没有任何 errors/warning 的情况下工作得很好。自从我使用 SQL Server 2012 以来,自 SQL server 2008 以来有什么变化吗?还是我这边有什么误会?
与任何其他非主键列一样,如果值不受约束,您可以在一个列中有多个值。 HierarchyID 也不例外。如果 HierarchyID 不是主键,您的用例可以有多个根。但是如果要约束Node,需要把HierarchyID做成Primary Key,那么root只能有1个,root下有很多节点。
Microsoft 在此处讨论如何强制执行唯一性:
https://technet.microsoft.com/en-us/library/Bb677212(v=SQL.105).aspx