MS SQL如何在多个表之间共享identity seed?

3
在 MS SQL 中,是否可能在表格之间共享标识种子?例如,我可能有两个表:
表:PeopleA
- id - name 表:PeopleB
- id - name 我希望 PeopleA.id 和 PeopleB.id 之间始终具有唯一值。也就是说,我希望它们共享相同的标识种子。
注意:我不想听到关于表分区的内容,请仅告诉我是否可以在表格之间共享种子。

2
我不确定你所问的是否可行,但听起来最好将其作为单个表格,并使用类型代码来区分是A还是B的人。 - OMG Ponies
1
我必须同意OMG的观点。如果表具有相同的结构,那么它们确实应该只是一个表。请阅读有关规范化数据库的内容。 - Mark Byers
原因是为了高效地删除整个表。我的实际场景不是人名。 - Net Citizen
6个回答

4

原回答

不,你不能这样做,如果你想这么做,那么你的设计几乎肯定是有问题的。

当我在2010年写下这句话的时候,这是正确的。然而,在现在,SQL Server现在有序列可以做到OP想要做的事情。虽然这可能对OP(谁肯定早已解决了他的问题)没有帮助,但它可能会帮助其他想要做同样事情的人。 我仍然认为想要这样做通常是设计缺陷的标志,但现在可以直接使用。


1
+1 哈哈大笑!我猜总有一天每个人都会对这样的问题失去耐心的!;-) - Cade Roux
@网民 当然,这种情况下,您需要提供更多关于您的需求和驱动力的信息。 - Cade Roux
1
@Cade Roux:我不同意,我认为我应该只询问我想做的确切问题。例如,我不应该将其与3页规格混为一谈。你没有权利因为你认为别人很蠢就对他们的问题进行批评。我没问题@HLGEM发帖的语气,只是你的评论有问题。 - Net Citizen
@网友 对不起。基本上,关于共享IDENTITY的确切问题(有限的设计背景)已经在这里问过几次了(上周刚刚问过一次):https://dev59.com/g0zSa4cB1Zd3GeqPnIPu https://dev59.com/mUXRa4cB1Zd3GeqPuspA - Cade Roux

3

不确定您的设计是什么,但有时使用继承类型模型是很有用的,其中您有一个基本表格,然后是具有实质上不同属性的子表格,例如:

Person
------
PersonID <-- PK, autoincrement
FirstName
LastName
Address1
...

Employee
--------
PersonID <-- PK (not autoincrement), FK to Person
JobRoleID
StartDate
Photo
...

Associate
---------
PersonID <-- PK (not autoincrement), FK to Person
AssociateBranchID
EngagementTypeID
...

在这种情况下,您需要将基本值插入到 Person 表中,然后使用生成的 PersonID 将其插入到 Employee 或 Associate 表中。

3
不,但我猜您可以在一个表上创建IDENTITY(1, 2),另一个表上创建IDENTITY(2, 2),这不是非常健壮的设计方案。如果从TableA中获取实体,则可以将其称为“A1”,“A2”等,如果从TableB获取,则可以将其称为“B1”,“B2”等,这样就不可能出现重复了。显然,您实际上并不需要将A和B存储在数据库中,因为它是暗示的。

1
我猜当你有一个像PeopleA和PeopleB这样的表设计需要共享一个唯一的标识列时,使用奇偶身份验证方式不会比它已经存在的设计更加混乱。 - KM.

2
如果您确实需要这样做,请创建第三个表PeopleMaster,其中包含identity(1,1),使其他两个表只具有对此标识值的int FK。先插入PeopleMaster,然后再插入PeopleA或PeopleB。
我认为这是一个不好的设计。创建一个带有PeopleType标志(“A”或“B”)和所有公共列的表,并在必要时创建子表(用于PeopleA和PeopleB之间的任何不同列)。

1

不是的。

但我曾经参与过类似概念的项目。在我的情况下,我们创建了一个名为[MasterIdentity]的表,其中只有一列[Id](一个标识种子)。数据库中没有任何其他表具有标识种子列,当需要标识时,会调用函数/存储过程将值插入到[MasterIdentity]表中并返回种子值。


0

不,SQL Server本身没有内置此功能。

显然,有一些解决方法,例如使用FK关系到具有单个IDENTITY的表并设置一些复杂的约束或触发器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接