如何设置SQL Server以生成分组索引?

时间:2011-04-22 23:48:10

标签: sql-server nhibernate fluent-nhibernate relational-database auto-increment

假设我在数据库中有Projects表来跟踪活动项目,以及跟踪每个Tasks的{​​{1}}的{​​{1}}表。每个表都有一个普通的自动生成主键,但我也希望每个任务都有一个Tasks相对于Project。因此,当TaskNumber添加到Project时,会为它们分配从001,002,003等递增的数字,从每个项目的001开始。

首先我想我可以在每个Tasks存储一个Project字段。但是,在有机会添加新任务并增加NextTaskNumber字段之前,多个人可以从数据库中请求相同的号码。我不想在Project中找到重复的任务编号。


更新

感谢目前为止的答案,但我忘了提到一个关键点。我实际上是通过NHibernate访问数据库而不是直接通过SQL命令。那么通过N Hibernate映射有没有办法做到这一点?或者,我可以在数据库上设置一个触发器,以便在创建新任务时填充任务编号字段吗?

2 个答案:

答案 0 :(得分:0)

你可以使用你的NextTaskNumber想法如果你对代码有足够的控制权,那么你可以强制执行插入任务表的部分使用包含NextTaskNumber读数的事务,创建Task行,然后更新NextTaskNumber。事务应锁定数据,以便您不会有重复的TaskNumber条目。

答案 1 :(得分:0)

以下代码受我惯常的“我刚刚醒来”的责任影响:

单个插入

INSERT INTO Tasks
            (ProjectID,Name,GroupedIndexField)
SELECT @ProjectID
       , 'Do Some Work'
       , ( SELECT ISNULL(MAX(GroupedIndexField), 0)
             FROM Tasks
            WHERE ProjectID = @ProjectID ) + 1

多个插入

INSERT INTO Tasks
            (ProjectID,Name,GroupedIndexField)
SELECT tblTasksToInsert.ProjectID
       , tblTasksToInsert.Name
       , ( SELECT ISNULL(MAX(GroupedIndexField), 0)
             FROM Tasks
            WHERE ProjectID = tblTasksToInsert.ProjectID ) + ROW_NUMBER() OVER (PARTITION BY tblTasksToInsert.ProjectID ORDER BY InsertionOrder)
  FROM tblTasksToInsert

创建视图

使用以下查询创建视图:

SELECT TaskID
       , ProjectID
       , ROW_NUMBER() OVER (PARTITION BY ProjectID ORDER BY TaskID ) AS GroupedIndexValue
  FROM Tasks

SQL Server Denali

SQL Server Denali允许您创建序列。每个项目可以有多个序列,尽管这不是真正使用它们的正确方法。