在MS SQL中是否可以跨表共享身份种子?例如,我可能有2个表:
表:PeopleA
表:PeopleB
我希望PeopleA.id
和PeopleB.id
之间始终拥有唯一的值。即我希望他们共享相同的身份种子。
注意:我不想听到有关表分区的信息,只是关于是否可以跨表共享种子。
答案 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并且有一些奇特的约束或触发器。