Sql server 计算列,如何增加子集

Sql server 计算列,如何增加子集,sql-server,Sql Server,我想做的是有这样一个表结构: TypeID int not null (foreign key) ItemID int (computed value +1 for each value with same TypeId) Data string e、 g 如果我将列作为键进行计算,那么与标识列相比,并发性会出现问题吗?列的ItemId似乎是(按TypeID分区)上的行数的结果(请参见)——这就是计算它的方式吗?因此,由于并发问题(两个事务插入具有相同

我想做的是有这样一个表结构:

TypeID   int       not null (foreign key)
ItemID   int       (computed value +1 for each value with same TypeId) 
Data     string
e、 g


如果我将列作为键进行计算,那么与标识列相比,并发性会出现问题吗?

列的
ItemId
似乎是(按TypeID分区)上的
行数的结果(请参见)——这就是计算它的方式吗?因此,由于并发问题(两个事务插入具有相同
TypeID
的行,正如您所提到的),它实际上不适合作为键的一部分。但这与“如何增加子集”有什么关系?什么的子集?你的问题是什么?为什么不把别的东西作为键呢(通常是一个人工的自动递增列)

这个
ItemId
列似乎是一个
行数的结果(按TypeID划分)
(请参见)——这就是你计算它的方法吗?因此,由于并发问题(两个事务插入具有相同
TypeID
的行,正如您所提到的),它实际上不适合作为键的一部分。但这与“如何增加子集”有什么关系?什么的子集?你的问题是什么?为什么不把其他东西作为关键点(通常是一个人工的自动增量列)?

我同意Alex的观点,你的计算列可以通过本机分析功能(行数、秩、密集秩)而不是作为计算列复制,这可能需要使用CLR,或者最好使用触发器以您希望的方式填充
itemid


我建议将
itemid
列作为标识列。你想要的听起来像是一个代理键,一个伪键(不要与自然键和人工键混淆),你可以用它来引用和显示给用户,而不必泄露底层的数据模型。对于您的情况,我仍然不喜欢这种方法,因为要使用它,您仍然需要两段数据才能获得唯一的行/记录—typeid和代理键。

我同意Alex的观点,您的计算列可以使用本机分析功能(行号、秩、密秩)进行复制而不是作为计算列,这可能需要使用CLR,或者最好使用触发器,以您希望的方式填充
itemid


我建议将
itemid
列作为标识列。你想要的听起来像是一个代理键,一个伪键(不要与自然键和人工键混淆),你可以用它来引用和显示给用户,而不必泄露底层的数据模型。对于您的情况,我仍然不喜欢这种方法,因为要使用它,您仍然需要两段数据才能获得唯一的行/记录—typeid和代理键。

对于这个计算列,您的公式是什么?对于这个计算列,您的公式是什么?上面的示例有些做作,目前我使用的是标识列(而不是上面计算的“ItemId”),但是用户要求显示“有意义的”键(标识列不合适)。从我读到的主题来看,我不认为我可以简单地增加每个唯一TypeID的ItemId(并将其用作主键的一部分),但我想检查是否有巧妙的方法。@Grayson,“适合显示”列集为什么必须是键?如果显示没有发生在事务的中间(这也将是一个混乱的其他原因!!),所讨论的一对列将是唯一的(无论是生成<代码> ItIDID < /代码>我的方式,或者以任何其他方式,-),你是对的,它不是。我会照你的建议去做。如果有一种“合理”的方法按照我的建议设置键,那么(在数据库上下文中)我可以简单地(删除一个表)。然而,这不是什么大不了的事。。。我只是想确保我有“最佳”选项。无法在计算列上获得正确的语法:ROW_NUMBER()over(partition BY modelentityid ORDER BY datainstanceid DESC)我得到错误:“窗口函数只能出现在SELECT或ORDER BY子句中。”您在哪个子句中使用ROW_NUMBER?我也对消息感到困惑(我过去在WHERE子句中使用过它)。上面的示例有些做作,目前我使用的是标识列(而不是上面计算的“ItemId”),但是用户要求显示“有意义的”键(标识列不合适)。从我读到的主题来看,我不认为我可以简单地增加每个唯一TypeID的ItemId(并将其用作主键的一部分),但我想检查是否有巧妙的方法。@Grayson,“适合显示”列集为什么必须是键?如果显示没有发生在事务的中间(这也将是一个混乱的其他原因!!),所讨论的一对列将是唯一的(无论是生成<代码> ItIDID < /代码>我的方式,或者以任何其他方式,-),你是对的,它不是。我会照你的建议去做。如果有一种“合理”的方法按照我的建议设置键,那么(在数据库上下文中)我可以简单地(删除一个表)。然而,这不是什么大不了的事。。。我只是想确保我有“最佳”选项。无法在计算列上获得正确的语法:ROW_NUMBER()over(partition BY modelentityid ORDER BY datainstanceid DESC)我得到错误:“窗口函数只能出现在SELECT或ORDER BY子句中。”您在哪个子句中使用ROW_NUMBER?我也对这个消息感到困惑(我过去曾在WHERE子句中使用过它)。
TypeId  ItemId  Data 
1       1       "some data"
1       2       "some data"
2       1       "some data"
3       1       "some data"
3       2       "some data"