uniqueidentifier データの使用

uniqueidentifier 型には、GUID (グローバル一意識別子) として機能する 16 バイトの 2 進数値が格納されます。GUID は一意であることが保証される 2 進数です。世界中の他のどのコンピュータも同じ GUID 値を生成しません。GUID の主な用途は、多くのサイトにある多くのコンピュータで構成されたネットワーク内で一意になる識別子を割り当てることです。

uniqueidentifier 列の GUID 値は、通常は次のいずれかの方法で取得します。

  • Transact-SQL ステートメント、バッチ、またはスクリプトから NEWID 関数を呼び出します。

  • アプリケーション コードから、GUID を返すアプリケーション API 関数またはメソッドを呼び出します。

Transact-SQL NEWID 関数とアプリケーション API 関数やメソッドでは、ネットワーク カードの識別番号と、CPU クロックから求めた一意な数値を使用して、新しい uniqueidentifier 型値が生成されます。ネットワーク カードには、それぞれ一意な識別番号が割り当てられています。NEWID が返す uniqueidentifier 型値はサーバー上のネットワーク カードを使用して生成されます。アプリケーション API 関数やメソッドが返す uniqueidentifier 型値はクライアント上のネットワーク カードを使用して生成されます。

通常、uniqueidentifier 型の値は定数として定義しません。uniqueidentifier 型の定数は、次の方法で指定できます。

  • 文字列形式 : '6F9619FF-8B86-D011-B42D-00C04FC964FF'

  • バイナリ形式 : 0xff19966f868b11d0b42d00c04fc964ff

IDENTITY プロパティとは異なり、uniqueidentifier 型は挿入された列に自動的に新しい ID を生成しません。たとえば、新しい uniqueidentifier 型の値を取得するには、テーブルの DEFAULT 句で NEWID 関数または NEWSEQUENTIALID 関数を指定するか、INSERT ステートメントで NEWID 関数を使用する必要があります。

CREATE TABLE MyUniqueTable
   (UniqueColumn   UNIQUEIDENTIFIER      DEFAULT NEWID(),
   Characters      VARCHAR(10) )
GO
INSERT INTO MyUniqueTable(Characters) VALUES ('abc')
INSERT INTO MyUniqueTable VALUES (NEWID(), 'def')
GO
注意

NEWSEQUENTIALID を使って GUID を生成し、インデックスのリーフ レベルでページの競合を緩和することができます。NEWSEQUENTIALID は、uniqueidentifier 型のテーブルの列に対して、DEFAULT 制約と併用する場合にのみ使用できます。

uniqueidentifier 型の列には、その列に UNIQUE 制約または PRIMARY KEY 制約が同時に指定されていない限り、1 つの uniqueidentifier 値が複数回出現することがあります。ソース テーブル内の同じ主キーが複数の列から参照されていると、その uniqueidentifier 主キーを参照している別のテーブル内の外部キー列には、個々の uniqueidentifier 値が複数回出現することになります。

テーブルには複数の uniqueidentifier 型の列を含めることができます。テーブルごとに、ROWGUIDCOL プロパティを含む uniqueidentifier 型の列を 1 つ指定できます。ROWGUIDCOL プロパティは、その列の uniqueidentifier 型の値がテーブル内の行を一意に識別することを示します。ただし、このプロパティには一意性を強制するメカニズムはありません。列に PRIMARY KEY 制約を指定するなど、他のメカニズムによって一意性を強制する必要があります。主に Microsoft SQL Server レプリケーションで ROWGUIDCOL プロパティが使用されます。マージ レプリケーションおよび更新サブスクリプションを使用するトランザクション レプリケーションでは、uniqueidentifier 列を使用して、テーブルの複数のコピー間で行の一意性を確保しています。

uniqueidentifier 型には次のような欠点があります。

  • 値が長く、あいまいである。このため、キーボードで値を正確に入力することはもちろん、値を覚えておくことも困難です。

  • 値がランダムであり、ユーザーが意味を把握しやすいパターンを値に付加できない。

  • uniqueidentifier 型の値がどのような順序で生成されたかを判断できない。連続して増加するキー値に依存する既存のアプリケーションには不適切です。

  • uniqueidentifier 型は長さが 16 バイトあり、4 バイト整数型などの他のデータ型に比べて長い。このため、uniqueidentifier 型のキーを使用してインデックスを作成すると、int 型のキーを使用してインデックスを作成する場合に比べて時間がかかります。

グローバルに一意である必要がない場合や、連続して増加するキーの方が望ましい場合は、IDENTITY プロパティの使用を検討してください。