3


1

シーケンシャルNEWID()

SQL Server 2008を使用しています。 一意の連続番号を生成する方法はありますか? NEWID()およびID列のプロパティを示す必要があります。つまり、常に一意ですが、後続の各値は前の値よりも大きくなります。 datetime / datetime2にすることはできません。十分に一意ではないためです。

ありがとう。

4 Answer


7


CREATE TABLE demo_table (
    demo_id    uniqueidentifier NOT NULL,
    demo_value int
);

ALTER TABLE demo_table  ADD CONSTRAINT dc_demo
                        DEFAULT NEWSEQUENTIALID()
                        FOR demo_id;

順次一意識別子にはデフォルトの制約を使用する必要があります。

残念ながら、 `NEWSEQUENTIALID()`の制限は、マシンの再起動後にシーケンスを保証しないことです。

NEWID()NEWSEQUENTIALID()、および `IDENTITY`のパフォーマンス比較については、次の記事を確認できます:" http://www.codeproject.com/KB/database/AgileWareNewGuid.aspx [コードプロジェクト:パフォーマンス比較-Identity()x NewId()x NewSequentialId] "。


2


再起動後に厳密に単調増加する場合は、数値IDENTITYを使用します。 NEWSEQUENTIALIDはこれをサポートしていません。

独自の結合列を発明しない限り、ケーキを持って食べることはできません。 ただし、これにより、物事がより広くなり、使いにくくなります。

IDENTITYとNEWSEQUENTIALIDの両方が内部使用のみ(たとえば、人間が読める形式ではない)であることを考えると、なぜこの要件ですか?


1


SQL Server 2008のUNIQUEIDENTIFIERカラムのデフォルト値として `newsequentialid()`を定義できます-残念ながら、それがすべてです。

CREATE TABLE dbo.MyTable
(
    ID UNIQUEIDENTIFIER DEFAULT (newsequentialid())
    ......
)

他の方法でシーケンシャルID(GUID)を生成する方法はありません:-(


1


`ROWVERSION`データ型は1つの可能性ですが、主キーとしての使用には適していません。また、自動的に設定されます。

別のオプションは、自分で作成することです。 必要な幅の列を持つテーブルと、アトミックに値をインクリメントしてそれを返すコードを用意します。 適切なロックまたはトランザクションがあれば、それを使用して、主キーとして適切な値を生成できます。

SQL CLR関数でも同様のことができます。 そのようにして、より効率的にすることも可能かもしれません。 たとえば、現在の時刻を使用できますが、最後に返された値を静的に格納できます。 次に、次の値が最後の値と同じ場合、1ずつ増加します。