假设我在数据库中有Projects
表来跟踪活动项目,以及跟踪每个Tasks
的{{1}}的{{1}}表。每个表都有一个普通的自动生成主键,但我也希望每个任务都有一个Tasks
相对于Project
。因此,当TaskNumber
添加到Project
时,会为它们分配从001,002,003等递增的数字,从每个项目的001开始。
首先我想我可以在每个Tasks
存储一个Project
字段。但是,在有机会添加新任务并增加NextTaskNumber
字段之前,多个人可以从数据库中请求相同的号码。我不想在Project
中找到重复的任务编号。
更新
感谢目前为止的答案,但我忘了提到一个关键点。我实际上是通过NHibernate访问数据库而不是直接通过SQL命令。那么通过N Hibernate映射有没有办法做到这一点?或者,我可以在数据库上设置一个触发器,以便在创建新任务时填充任务编号字段吗?
答案 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允许您创建序列。每个项目可以有多个序列,尽管这不是真正使用它们的正确方法。