2011-07-22 9 views
1

私のアプリケーションで一意の識別子が必要です。その目的のために、私はデータベース内に1列の 'unique_id'(BIGINT)と1行しか入っていないテーブルを作成しました アイデアはストアドプロシージャを使って必要なときに次の識別子を取得することです。このようなライン操作は、仕事をするだろう:SQL Server - 1列の更新、ロックが必要ですか?

UPDATE identifier_table SET unique_id = unique_id + 1 OUTPUT INSERTED.unique_id 

この操作はアトミックである、または私はセットアップにテーブルの上にロックを必要とするならば、誰かが確認することができ

おかげ

+4

アイデンティティフィールドを使用しない理由は何ですか? – HLGEM

+0

+1からHGLEM、アイデンティティを使用するだけではなく、デナリでシーケンスを使用するのはなぜですか? – Andrew

+0

答えをありがとう!それは同じ目的を果たし、テーブル内に1行しか残さないと思う - アイデンティティ列を更新する方法を考えないでください。私はスペースが最近安いことを実感しています。だから、行を挿入して毎回掃除するほうがいいですか? – Bourgui

答えて

0

をそれはアトミックですか!これは単なる更新文であり、更新ロック付きのエンジンで管理されるため、並行性は問題ありません。 SEの出力は、図示のように、またはあなたがこのような何かを行うことができます。

DECLARE @unique_id bigint; 

UPDATE identifier_table 
SET 
    @unique_id = unique_id + 1, 
    unique_id = unique_id + 1; 

SELECT @unique_id uniqueid; 

あなたは@unique_id OUTPUTパラメータを作成した場合は、select文なしで値を得ることができるか、別のストアド・プロシージャで簡単にそれを使用します。

+0

ありがとうErikE!パーティーに少し遅れたが、それは私の発見を裏付ける:o) – Bourgui

関連する問題