1

SQL Server 2008 R2を使用して、主キーの2つの列部分の1つに基づく自動インクリメントである3番目の列を持つテーブル(すでに2つの列に主キーがあります)が必要です。

つまり、テーブルに新しいレコードを追加するときに、次のように自動インクリメントファイルを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は主キーの2つのフィールドです。

同じPK1に対して同時挿入を実行する必要がある可能性が非常に高いため、明白なアプローチを使用したくありませんMAX(Afield)+1。これにより、遅かれ早かれ、同じPK1のAIfieldに重複が作成されます。

助言がありますか?

4

3 に答える 3

2
select pk1,pk2,ROW_NUMBER() over (partition by pk1,pk2 order by (select 0)) as AIfield
from yourtable
于 2012-08-28T04:37:12.963 に答える
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 PK1=@PK1
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 @AIfield=@AIfield+1
     END
    ELSE SET @inserted=1
 END CATCH
END

SQLネイティブのアプローチがあるのだろうか

于 2012-08-28T04:57:22.297 に答える
0

以下のクエリを使用してください:

Select PK1, PK2, ROW_NUMBER() over (partition by PK1 order by PK1, PK2) as AIfield
From yourtable
于 2012-08-28T08:36:51.233 に答える