2017-04-07 4 views
0

データベースの質問はこちら 2次IDまたは3次IDで自動インクリメントを実行することはできますか? は、私が何かversionbasedをする必要があるので、この想像:データベーススキーム、オートインクリメント

ID Phrase PhraseID PhraseVersion 
1 ""  1   1 
2 ""  1   2 
3 ""  1   3 
4 ""  2   1 

PhraseIDがデータベースに追加したのと同じ数とすることができます。 PhraseIDが存在する場合、PhraseVersionの番号をautoincrementにします。 PhraseIDが存在しない場合は、1から数えてPhraseVersionを開始します。

これは可能ですか?

答えて

1

PhraseVersionの計算列を使用すると、同じPhraseIDおよびIdの行が現在の行よりも小さいか等しい行がカウントされます。計算列を持つテーブルを作成し、その後

CREATE FUNCTION dbo.GetPhraseVersion (
    @PhraseId int, 
    @id int 
) 
RETURNS INT 
AS 
BEGIN 
    RETURN (
     SELECT COUNT(*) 
     FROM T 
     WHERE PhraseId = @PhraseId 
     AND Id <= @id 
    ) 
END 
GO 

はそれを行うには、PhraseVersionを計算するUDFを作成する必要があり、テストのために今

CREATE TABLE T 
(
    id int identity(1,1), 
    PhraseId int, 
    PhraseVersion as dbo.GetPhraseVersion(PhraseId, id) 
) 

GO 

から4を挿入します記録:

INSERT INTO T (PhraseId) VALUES(1),(1),(1),(2) 

選択:

SELECT * 
FROM T 

結果:

id PhraseId PhraseVersion 
1 1   1 
2 1   2 
3 1   3 
4 2   1 

You can see a live demo on rextester.

+0

は、高い周波数の挿入時に、この信頼性はありますか? PhraseIdとPhraseVersionのペアが重複する可能性はありますか? – ibubi

+0

私は分かりません。最初に私はあなたが高頻度と考えているものをノーとは言わず、大量のデータでそれをテストしたことはありません。あなたのsecpnd質問に、それは起こるべきではありません。 –

関連する問題