2011-12-23 6 views
5

レコードを物理的に挿入しなくても、フィールドに次のプライマリキーを表示する必要があるプロジェクトがありますか?SQL Serverにレコードを挿入しないでテーブルの次の主キーの値を知る方法?

レコードを挿入せずにプライマリキーの次の値を知る方法はありますか?

つまり IDの列を主キーとする10個のレコードがあります。 これで10番目のレコードが削除されたので、次の値は11になります。

テーブルに物理的にレコードを挿入することなく次のプライマリキー(私の場合は11)の値を知りたいと思います。

要するに、主キーの将来の次の値。

どうすれば入手できますか?

解決策を提供してください。

+0

解決策が見つかりました。 –

+0

物理レコードを挿入せずに次の値を取得することが可能です。 –

+0

は有効な解決策ではありません**。 ** CURRENT **の値を照会することはできますが、**保証はしません**次の値は..... ..... –

答えて

8

EDIT(非常に重要)

を選択しますが、この値を保証しません。この理由は、コメントに記述されている@marc_sと、値を要求した時刻とそれを使用する時刻の間に、別のトランザクションがこのテーブルに挿入された可能性があるため、取り出された値がNULLおよび無効であるという前提があります。

前述のように、実装がそのような前提に基づいている場合は、設計上の誤りがあり、この解決策を最優先事項として再検討する必要があります。 IDENT_CURRENT (Transact-SQL)

から

は、指定したテーブルまたはビュー のために生成された最後のID値を返します。生成された最後のID値は、任意のセッションおよび任意の スコープに適用できます。

は本当に、次の例を見

CREATE TABLE #Table (
     ID INT IDENTITY(1,1), 
     Val INT 
) 

INSERT INTO #Table SELECT 1 
INSERT INTO #Table SELECT 2 
INSERT INTO #Table SELECT 3 

SELECT * FROM #Table 

DELETE FROM #Table WHERE ID >= 2 

SELECT * FROM #Table 

SELECT IDENT_CURRENT('#Table') 

DROP TABLE #Table 
+0

これはあなたに**現在の**値を与えることができます - *保証なし** ** NEXT **の値は.... –

+0

@ marc_sこれはあなたにそのテーブルに使われた最後のアイデンティティを与えるので、次はアイデンティティ間隔が何であるかに依存します。通常は1です、次は+ 1になると思う? –

+1

まず最初に、IDENTITYは常に1だけインクリメントされるわけではありません。そのことを考慮しても、その価値を得る**という保証はありません - 別のトランザクションでは、IDENT_CURRENTを照会する時点と行が挿入される時点との間に行を挿入する可能性があります。 ** IDENTITYの値を前もって知るための信頼できる方法はありません**。 –

3

あなたが求めていることは、実際には意味がありません。データベースは複数のアクセスをサポートするように設計されているため、レコードを挿入せずに次の主キーIDを判断する方法があったとしても、次のトランザクションが完了する前に別の接続がそのテーブルに書き込みを行わず、そして、もしあなたが「よく私はそれに鍵を掛けることができる」と思っているなら、あなたは基本的に、将来の身元証明鍵があなたを助けるかもしれないあらゆる種類のもっともらしい状況を排除しました。

今後のIDキーを希望する理由は何ですか?

1

現在のバージョンのSQL Server(2008 R2)では、IDENTITYメカニズムを使用すると、できません。は、次の値を前もって知っています。 実際に行を挿入するまで次の値を知っている正しい方法を保証します。行がテーブル内に格納されると、その値が決定されて返されます。

SQL Server 2012の(「デナリ」)は、ほぼIDENTITY列と同じであるSEQUENCESを持っています - しかし、スタンドアローン、および配列と、あなたは次の値を求める(と、それを使用する)ことができます

シーケンスについて詳しく読む:

0

IDを選択しますENT_CURRENT( 'ユーザー')

このメソッドは次のIDを予測するために使用することができることに留意すべきであるIDENT_CURRENT( 'テーブル名')

+0

これはあなたに** CURRENT **値を与えますが、それは** NEXT VALUE **の意味を教えてくれます...... –

+0

いいえ、ちょうど+1でそれを得る必要があります確かに –

+0

もちろんですが、大規模なアプリケーションがあり、多くのクライアントブラウザからの挿入を行っている場合は申し訳ありませんが、私は非常に小さい –

0

ない素晴らしいアイデアを持っていますが、保証の主キーをしたい場合は、私の提案は、一時的にダミーレコードを挿入し、その主キーを取得することであろうと、レコードがコミットされたときにUPDATEを使用してレコードを変更するか、またはユーザーが挿入を取り消した場合にレコードを削除するかのいずれかです。いずれにしても、仮想キーを使用するよりも優れています。

関連する問題