计算列,如何增加子集

时间:2010-02-09 02:49:23

标签: sql-server

我想要做的是拥有这样的表结构:

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"

如果我将计算列作为键,我是否会遇到并发问题而不是标识列?

2 个答案:

答案 0 :(得分:2)

ItemId列似乎是ROW_NUMBER OVER(PARTITION BY TypeID)的结果(请参阅the docs) - 您是如何计算它的?因此,由于并发问题(两个事务插入具有相同TypeID的行),它并不适合作为密钥的一部分,如您所述。但这与“如何增加子集”有什么关系呢?什么子集是什么?你的问题是什么?为什么不把其他东西改为密钥(通常是人工自动增量列)?

答案 1 :(得分:2)

我同意Alex的观点,您的计算列可以使用原生分析功能(ROW_NUMBER,RANK,DENSE_RANK)而不是计算列进行复制,这可能需要使用CLR,或者只需更好地使用触发器来填充{@ 1}}列以您希望的方式。

我建议将itemid列作为标识列。你想要的东西听起来像一个替代钥匙,一个假钥匙(不要与自然和人工钥匙混在一起),你可以用它来参考&向用户显示而不泄露底层数据建模。我仍然不喜欢你的情况的方法是,使用它,你仍然需要两个数据来获得一个独特的行/记录 - typeid 代理键。