1

uniqueidentifierをクラスター化された主キーとして使用している SQL Server テーブルがあります。テーブルを作成し、いくつかの行を挿入した後、サーバーを再起動しました。列はNEWSEQUENTIALID()デフォルト値として使用します。

ただし、再起動後、次の挿入により、以前よりも値が低い GUID を持つ行が作成され、SELECT *ステートメントの先頭に表示されました。

私の質問: GUID タイプのクラスター化された主キーを使用しているときに、シャッフルを防止する (別名、行の順序を保持する) 方法はありますか?

4

2 に答える 2

3

時系列順を保証する場合は、 という列を追加し、CreatedDateNULL を許可しないように設定し、デフォルトを に設定しますCURRENT_TIMESTAMP。次に、最後の 10 行を取得するには、次のように言えます。

SELECT TOP 10 (*) FROM dbo.foo ORDER BY CreatedDate DESC;

このようにあなたTOPは理にかなっています。なしORDER BYでは、マークが説明したように、あなたTOPは無意味であり、結果は比較的予測可能ですが(完全にランダムではないため、「任意」という用語を好むでしょう)、同じ順序で並べる信頼性はありませんそれらが挿入された順序。これは、主キーに GUID を使用するか整数を使用するかに関係なく当てはまります。保証はありません。

で注文の保存を保証することはできNEWSEQUENTIALID()ません。申し訳ありませんが、それは機能しません。

于 2012-08-15T19:04:01.793 に答える
0

ドキュメンテーションによると、Windows の起動後に行われた最後の GUID の後にあることが保証された新しい GUID を生成します。

そこに追加された日付の列を入れて、それを注文に使用し、GUID に newid を使用します。機能するだけでなく、より多くの情報を提供し、何が起こっているのかを完全に明らかにします。言うまでもなく、デザインの移植性を高めます。

于 2012-08-15T19:06:07.817 に答える