MS SQL在表中共享标识种子

时间:2010-03-25 20:38:54

标签: sql sql-server

在MS SQL中是否可以跨表共享身份种子?例如,我可能有2个表:

表:PeopleA

  • id
  • 姓名

表:PeopleB

  • id
  • 姓名

我希望PeopleA.idPeopleB.id之间始终拥有唯一的值。即我希望他们共享相同的身份种子。

注意:我不想听到有关表分区的信息,只是关于是否可以跨表共享种子。

6 个答案:

答案 0 :(得分:4)

原始答案

  

不,你不能,如果你想这样做,你的设计几乎就是   肯定是有缺陷的。

当我在2010年写这篇文章时,这是真的。但是,此时SQL Server现在具有可以执行OP想要执行的操作的序列。虽然这可能无助于OP(他肯定早已解决了他的问题),但它可能有助于其他人寻求做同样的事情。我仍然认为想要这样做通常是设计缺陷的标志,但现在可以开箱即用。

答案 1 :(得分:3)

不,但我想你可以在一张桌子上创建一个IDENTITY(1,2),在另一张桌子上创建一个IDENTITY(2,2)。但它并不是一个非常强大的设计。

你能否将你的实体称为'A1','A2',......如果它们来自TableA和'B1','B2'等......如果它们来自TableB?然后就不可能得到重复。显然,您实际上并不需要将A和B存储在数据库中,因为它是隐含的。

答案 2 :(得分: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 :(得分:2)

如果你真的需要这个,创建第​​三个表PeopleMaster,其中存在标识(1,1),使另外两个表只有int FK到这个标识值。插入PeopleMaster,然后插入PeopleA或PeopleB。

我真的认为这是一个糟糕的设计。使用PeopleType标志(“A”或“B”)创建一个表并包含所有公共列,并在必要时创建子表(对于PeopleA和PeopleB之间的任何不同列)

答案 4 :(得分:1)

没有。

但我曾参与过使用类似概念的项目。就我而言,我们所做的是有一个名为[MasterIdentity]的表,其中有一列[Id](一个标识种子)。数据库中没有其他表具有任何具有标识种子的列,并且当需要标识时,调用函数/存储过程以将值插入[MasterIdentity]表并返回种子。

答案 5 :(得分:0)

不,SQL Server没有内置任何功能。

显然有一些解决方法,例如使用FK关系到一个表,它只有一个IDENTITY并且有一些奇特的约束或触发器。

相关问题