2012-08-28 61 views
0

使用SQL Server 2008的值改变R2我想有一个表(已经对2列的主键)与第三列是基于所述两列中的一个自动增量主键的一部分。SQL Server的自动递增另一场

在其它方面,我想添加新记录到表时,具有自动增量文件AIfield如下自动递增:

PK1 PK2 AIfield 
    ------------------ 
    1 A  1 
    1 B  2 
    1 C  3 
    2 A  1 
    2 B1 2 
    2 B2 3 
    2 C1 4 

其中PK1和PK2是主要的两个场键。

我不想使用明显的MAX(Afield)+1方法,因为很可能我必须为同一个PK1执行并发插入操作 - 迟早会在相同的PK1中为AIfield创建重复项。

有什么建议吗?

+1

要大家:这个问题是不是得到一个选择具有一个唯一的编号,这是并发性安全更新表的一个值的列。所以所有的答案只是一个SELECT ROW_NUMBER()不是回答问题 – eddo

回答

0

那么,这种方法可以创建在PK1和AIfield

CREATE UNIQUE NONCLUSTERED INDEX [test] ON [Table] 
(
[AIfield] ASC, 
[PK1] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

唯一索引和处理违规行为的唯一

DECLARE @inserted BIT=0 
DECLARE @AIfield BIGINT 
SELECT @AIfield=MAX(AIfield)+1 FROM Table WHERE [email protected] 
WHILE @inserted=0 
BEGIN 
BEGIN TRY 
    INSERT INTO Table(AIfield,PK1,PK2) 
    SELECT @AIfield,@PK1,@PK2 
    SET @inserted=1 
END TRY 
BEGIN CATCH 
    IF ERROR_NUMBER()=2601 
    BEGIN 
    SET @[email protected]+1 
    END 
    ELSE SET @inserted=1 
END CATCH 
END 

我不知道是否有一种方法更SQL本地虽然

1
select pk1,pk2,ROW_NUMBER() over (partition by pk1,pk2 order by (select 0)) as AIfield 
from yourtable 
+0

这是要并发插入安全吗? – eddo

+0

你能给我多一点细节吗? – AnandPhadke

+0

你可以做的是,把上面的查询结果为表变量或临时表,然后做任何你需要 – AnandPhadke

0

使用下面的查询:

Select PK1, PK2, ROW_NUMBER() over (partition by PK1 order by PK1, PK2) as AIfield 
From yourtable