我想要做的是拥有这样的表结构:
TypeID int not null (foreign key)
ItemID int (computed value +1 for each value with same TypeId)
Data string
e.g。
TypeId ItemId Data
1 1 "some data"
1 2 "some data"
2 1 "some data"
3 1 "some data"
3 2 "some data"
如果我将计算列作为键,我是否会遇到并发问题而不是标识列?
答案 0 :(得分:2)
ItemId
列似乎是ROW_NUMBER OVER(PARTITION BY TypeID)
的结果(请参阅the docs) - 您是如何计算它的?因此,由于并发问题(两个事务插入具有相同TypeID
的行),它并不适合作为密钥的一部分,如您所述。但这与“如何增加子集”有什么关系呢?什么子集是什么?你的问题是什么?为什么不把其他东西改为密钥(通常是人工自动增量列)?
答案 1 :(得分:2)
我同意Alex的观点,您的计算列可以使用原生分析功能(ROW_NUMBER,RANK,DENSE_RANK)而不是计算列进行复制,这可能需要使用CLR,或者只需更好地使用触发器来填充{@ 1}}列以您希望的方式。
我建议将itemid
列作为标识列。你想要的东西听起来像一个替代钥匙,一个假钥匙(不要与自然和人工钥匙混在一起),你可以用它来参考&向用户显示而不泄露底层数据建模。我仍然不喜欢你的情况的方法是,使用它,你仍然需要两个数据来获得一个独特的行/记录 - typeid 和代理键。