[英]MS SQL share identity seed amongst tables
在MS SQL中,是否可以跨表共享身份种子? 例如,我可能有2个表:
表:PeopleA
表:PeopleB
我希望PeopleA.id
和PeopleB.id
之间始终拥有独特的价值观。 即我希望他们共享相同的身份种子。
注意 :我不想听到表分区,只是关于是否可以在表之间共享种子。
原始答案
不,你不能,如果你想这样做,你的设计几乎肯定是有缺陷的。
当我在2010年写这篇文章时,这是真的。 但是,此时SQL Server现在具有可以执行OP想要执行的操作的序列。 虽然这可能无助于OP(他肯定早已解决了他的问题),但它可能有助于其他人寻求做同样的事情。 我仍然认为想要这样做通常是设计缺陷的标志,但现在可以开箱即用。
不,但我猜你可以在一张桌子上创建一个IDENTITY(1,2),在另一张桌子上创建一个IDENTITY(2,2)。 但它并不是一个非常强大的设计。
您是否可以将您的实体称为'A1','A2',......如果它们来自TableA和'B1','B2'等......如果它们来自TableB? 然后就不可能得到重复。 显然,您实际上并不需要将A和B存储在数据库中,因为它是隐含的。
不确定您的设计是什么,但有时使用继承类型模型是有用的,其中您有一个基表,然后是具有显着不同属性的子表,例如:
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表。
如果你真的需要这个,创建第三个表PeopleMaster,其中存在标识(1,1),使另外两个表只有int FKs到这个标识值。 插入PeopleMaster,然后插入PeopleA或PeopleB。
我真的认为这是一个糟糕的设计。 使用PeopleType标志(“A”或“B”)创建一个表并包含所有公共列,并在必要时创建子表(对于PeopleA和PeopleB之间的任何不同列)
没有。
但我曾参与过使用类似概念的项目。 在我的情况下,我们所做的是有一个名为[MasterIdentity]
的表,它有一列[Id]
(身份种子)。 数据库中没有其他表具有任何具有标识种子的列,并且当需要标识时,调用函数/存储过程以将值插入[MasterIdentity]
表并返回种子。
不,SQL Server没有内置任何功能。
显然有一些解决方法,例如使用FK关系到一个表,它具有单个IDENTITY并具有一些奇特的约束或触发器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.