2009-07-29 5 views
0

主キーの自動インクリメントに使用できる他の方法はありますか?したがって、通常のx + nの代わりにnが1の場合、nは5などの他の数になりますか?または、おそらく乱数が、次のIDがまだ一意であるようなものでしょうか?デフォルトのx + 1以外のプライマリキーの自動インクリメントに使用できる他の戦略はありますか?

私はその用途がどんなものか、それが良い考えであっても、私は好奇心が強いです。

+1

プライマリキーは一意でなければならないため、乱数はあまり良くありません。 –

+0

技術的には、「自動インクリメント」はx + n(ここでは通常nはこのコンテキストでは1)に限られます。おそらく、あなたは次のIDを生成するための戦略を意味します。 – Draemon

+0

@Dreamon、それは私ができるよりも良いと言いました。私は質問を更新します。ありがとう。 –

答えて

2

は "IDENTITY [(シード、をインクリメント)]

シードですテーブルにロードされた最初の行に使用される値。

増分ロードされた前の行のID値に追加される増分値です。あなたが本当にやるべきではない

ことの一つは、試してみて、独自のロールであるあなた本当には、あなたが何をしているか知っていると並行性を扱うことができない限り、など

編集:あなたは注意する必要がある理由:

1. @NextID = SELECT MAX(ID) FROM MyTable; 

2. INSERT INTO MyTable(ID + 1, Name) VALUES (@NextID, "Dan"); 

、ほとんどの場合、これはOKに動作します:

はここにあなた自身の増分などを使用しての危険性を示し、いくつかの擬似SQLです。しかし、大量データベースでは、ステップ1と2の間に別の挿入ステートメントが発生する可能性が常にあります。その後、主キー違反とエラーが発生します。それは頻繁に起こることはないかもしれませんが、それが起こると、それを特定するのは苦痛になります。

これを回避する方法は、手順1の前にLOCKを設定し、手順2の後にそれを解放することです。これにより、すべてのトランザクションが効果的にキューに入れられ、データベースは「シングルユーザー」モードで実行されます。大量のシステムでは、これはパフォーマンスに非常に有害な可能性があります。

これは、すべての主要データベースに、主キーの自動インクリメントを行うためのシーケンスまたは組み込みメソッドがある理由です。

+0

インクリメント引数については、関数を渡すと思いますが、関数は問題になりませんか? ;) –

0

使用しているRDBMSによって異なります。 MySQLでのマスター・マスター・レプリケーションの場合

SQL> create sequence fun_seq 
    start with 8 
    increment by 2; 
1

、別のサーバーが完全に独立した自動増分を持つことが重要です。オラクルでは、この(あなたが主キーのためのトリガーを設定して)だろう衝突を避けるためです。

キーは、各サーバーのオフセットと増分を指定することで別々に保持されます。たとえば、あなたがIDENTITY propertyを使用するT-SQL(MS SQL Serverの)では

auto_increment_increment= 2 
auto_increment_offset = 2 
1

また、マスター/マスターレプリケーションの状況に応じて異なるインクリメント方式を使用します。 1台のサーバーがカウントアップしており、もう1台がダウンしていると思います。偶数/奇数も完全に有効です。

0

ランダムID(およびサーバー間でユニークにできるもの)の場合は、intフィールドの代わりにGUIDフィールドを使用できます。これらには問題点や問題点がありますが、そのような設計に取りかかる前に、それらについて深くお読みください。

関連する問題