2011-06-08 15 views
4

可能性の重複:ID列を再播種されている場合は
Can I use a SQL Server identity column to determine the inserted order of rows?ID列を使用して行作成の順序を決定するのは悪い習慣ですか?

、行挿入の順序を決定するために使用することに使用することはできませんが、私が今までに理由がありませんアイデンティティを再シードします。

作成順序を決定するためにID列を使用しない理由は何ですか。

+0

http://stackoverflow.com/questions/708607/can-i-use-a-sql-server-identity-column-to-determine-the-inserted-order-ofrows – RThomas

+0

ご質問についてdatetimeの粒度。値は.000、.003、または.007秒の増分に丸められます。したがって、これより速く継承が発生する(つまり、一括挿入される)場合は、そうでない可能性があります。ここに文書化されています:http://msdn.microsoft.com/en-us/library/ms187819.aspx – RThomas

答えて

1

これは良い方法ではありません。たとえば、同時トランザクションのテーブルに挿入する2つのプロセスでは、一部のサーバーではIDのチャンクが割り当てられているため、あるトランザクションから挿入された行のIDは、他のトランザクションから挿入された行よりも小さくなります。また、時にはIDのシーケンスにギャップが生じることがあります。そして予期せぬことが起こるかもしれない他のシナリオもあるかもしれません。

要するに、自動インクリメントIDは、であり、必ずしも連続した昇順であることが保証されているとは限りません。

2

私はそれを使用しない理由は信頼できないだろうからです。 2つのプロセスがアイデンティティ値を同時に要求し、プロセス1が最初の値を取得し、プロセス2が2番目の値を取得したが、プロセス2が実際にトランザクションを完了したため、以前に挿入された可能性があります。レコードが実際に挿入された順序を知りたい場合は、挿入された日付の日時フィールドのみが信頼できる選択肢です。

+1

この問題は問題ではなく、私は 'max'、' min'を探したり、 'ORDER BY '。また、日付は機能しません、私のレコードは、同じ日付を持つように十分に迅速に作成されます。 – mikerobi

+1

@mikerobi - もう1つの問題は、あなたが決して(今も将来もDBAに)IDENTITY_INSERTを使用して、削除によって作成されたギャップに値を挿入しないことを保証することです。何かがある場合、細分性の欠如を回避するためのID列との組み合わせの日付が良いでしょう。 SQL Server 2008を使用している場合は、DateTime2を使用して、ID列に頼るのではなく、その列を使用するのに十分な精度を得ることができます。 – Thomas

関連する問題