2009-08-03 19 views
2

プライマリキー "fooID"を持つデータベースに "foo"というテーブルがあります。SQL Serverのエンティティごとの自動インクリメントフィールド?

私はfoo.fooIDを参照する外部キーを持つ2番目のテーブル "fooAttributes"を持っています。

私は新しい属性を挿入すると、fooAttributesテーブル(fooID、attributeNumber)に複合キーを持たせたいのですが、attributeNumberはfoo単位で自動的に増加します。したがって、foo番号1は属性1,2,3 ...を持ち、foo番号2は属性1,2,3などを持ちます。

これを行うにはどのようなSQL-Fuが必要ですか?実用的ですか?

+0

SQL Serverで手作業で多くの操作を行うことはできません。 IDENTITYフィールドはテーブル全体に適用されます(例:特定の「fooID」ではなく、テーブル全体で一意であることが保証されています。 –

答えて

2

MS SQL ServerのID列のようにSQL内でこれを自動的に行う方法はないと思います。私はこれをfooIDで渡すためにストアドプロシージャを構築します。例:

begin tran  
select @attributeNumber = isnull(max(attributeNumber),0)+1 
from fooAttributes where fooID = @fooID 

insert fooAttributes(fooID, attributeNumber) 
values(@fooID, @attributeNumber) 
commit 

おそらくあなたが望むものではありません。自動方法が可能な場合は、私もそれを見たいと思います。

+0

私はこれがこのようなものが私の解決策になるだろうと考えました。異なるユーザーからの2つの同時挿入による問題を回避するにはどうすればよいですか? –

+1

"begin tran"と "commit"内のselect&insertをラップすると、それらのステートメントは単一のトランザクションになり、その問題を防ぐことができます。 –

1

あなたが好きなようなサウンドトリガーはFooにあります。フーへの挿入で

Insert fooAttributes 
select SCOPE_IDENTITY(), attributeId 
from attributes 

私はあなたがすべての属性が含まれている「属性」と呼ばれるテーブルを持っていると仮定しています。そうでなければ、属性Idに到達するためにあなた自身のことをすることができます(サブセレクトのクロス結合が私の最初の推測になります)。

関連する問題