UUIDデータ型の使用

UUIDデータ型の概要

汎用一意識別子(UUID)は、コンピュータ・システム内の情報を識別するために使用される128ビットの数値です。UUIDを作成し、それを使用して対象を一意に識別できます。その正規のテキスト表現では、UUIDの16のオクテットは32桁の16進数で表され、ハイフンで区切られた5つのグループが、8-4-4-4-12の形式で合計36文字で表示されます(32の16進文字と4つのハイフン)。たとえば、a81bc81b-dead-4e5d-abff-90865d1e13b1です。

Oracle NoSQLでは、UUID値はUUIDデータ型で表されます。UUIDデータ型はSTRINGデータ型のサブタイプとみなされます。UUID値は正規のテキスト形式で表示され、一般に、様々なSQLの演算子および式の文字列値と同じように動作するためです。ただし、ディスク領域を節約するために、UUID値はディスクに簡潔な形式で保存されます。UUID値が主キーの場合、正規の36バイトの文字列は19バイトの文字列に変換されてから、ディスクに保存されます。UUID値が主キー以外の場合、正規の36バイトの文字列は16バイトの配列に変換されてから、ディスクに保存されます。

表の列は、CREATE TABLE文でUUID型を持つものとして宣言できます。アイデンティティ列はリージョン内のNoSQLクラスタ内でのみ一意であることが保証されるため、UUIDデータ型は、複数のリージョンにまたがる表のレコードに対してグローバルに一意の識別子が必要な場合に最適です。

UUIDデータ型の使用:

UUIDデータ型の列を宣言します。UUIDはSTRINGデータ型のサブタイプです。このUUID列は、GENERATED BY DEFAULTとして定義できます。UUID列の値を指定しない場合、UUID列の値が自動的に生成されます。

構文:

uuid_definition := AS UUID [GENERATED BY DEFAULT]

セマンティクス

列の型をUUID型として宣言します。GENERATED BY DEFAULTキーワードを使用すると、UUID列の値が自動的に生成されます(ユーザーが値を指定していない場合)。

UUID列の特性:

  • 1つの表に、STRING AS UUIDとして定義された複数の列を含めることができます。ただし、1つの表には、STRING AS UUID GENERATED BY DEFAULTとして定義されている列を1つのみ含めることができます。
  • アイデンティティ列もシステムによって生成されるため、アイデンティティ列とUUID GENERATED BY DEFAULT列は相互に排他的です。つまり、表ごとに1つのIDENTITY列または1つのUUID GENERATED BY DEFAULTのみが存在できます。
  • UUID列は、CREATE TABLE DDL文の一部として作成するか、ALTER TABLE DDL文を使用して既存の表に追加します。
  • 2次索引を介してUUID列を索引付けすることもできます。

例1: GENERATED BY DEFAULTのないUUID列

CREATE TABLE myTable (id STRING AS UUID,name STRING, PRIMARY KEY (id))
出力:
Statement completed successfully

前述の例では、id列にGENERATED BY DEFAULTが定義されていないため、新しい行を挿入するたびにid列の値を明示的に指定する必要があります。

INSERT INTO myTable values("a81bc81b-dead-4e5d-abff-90865d1e13b1", "test1")
出力:
Statement completed successfully

入力形式: 入力文字列はRFC 4122で指定されている形式に準拠する必要があります。入力文字列がクラスUUIDで説明されている文字列表現に準拠していない場合、IllegalArgumentExceptionがスローされます。

出力形式: 出力はUUID正規形式です。これは32桁の16進数で、ハイフンで区切られた5つのグループが、8-4-4-4-12の形式で合計36文字で表示されます(32の16進文字と4つのハイフン)。

UUID列の値は、ランダムに生成されたUUIDを36文字の文字列として返すrandom_uuid関数を使用して生成することもできます。UUID文字列を生成する関数を参照してください。

例2: GENERATED BY DEFAULTを使用するUUID列

CREATE TABLE myTable (id STRING AS UUID GENERATED BY DEFAULT, name STRING, PRIMARY KEY (id))
出力:
Statement completed successfully

前述の例では、id列にGENERATED BY DEFAULTが定義されているため、id列の値を指定せずに新しい行を挿入すると、Oracle NoSQL Databaseによってその値が自動的に生成されます。

INSERT INTO myTable VALUES(default,"test1")
出力:
Statement completed successfully

表5-2 アイデンティティ列とUUID列の比較

アイデンティティ列 UUID列
Oracle NoSQLクラスタによって列に値が自動的に割り当てられるように、列をアイデンティティとして宣言します。 複数リージョン・システムでNoSQLクラスタ列に一意の値を割り当てる必要がある場合は、列をUUIDとして宣言します。
表内のINTEGER、LONG、またはNUMBER列は、アイデンティティ列として定義できます。 UUIDはSTRINGデータ型のサブタイプです。
アイデンティティ列は、GENERATED ALWAYSまたはGENERATED BY DEFAULTのいずれかとして定義できます。 UUID列はGENERATED BY DEFAULTとして定義することも、データの挿入または更新時に文字列の値を指定することもできます。
単一クラスタ・アーキテクチャで理想的です。 アイデンティティ列はリージョン内のNoSQLクラスタ内でのみ一意であることが保証されるため、UUIDデータ型は、複数のリージョンにまたがる表のレコードに対してグローバルに一意の識別子が必要な場合に最適です。

対応するUUID列よりも記憶域のコストが少なくなります。

LONGが主キーの場合、最大で10バイトのコストがかかります。LONGが主キー以外の場合、最大で8バイトのコストがかかります。

対応するアイデンティティ列よりも記憶域のコストが多くなります。

UUID値が主キーの場合、19バイトのコストがかかります。UUID値が主キー以外の場合、16バイトのコストがかかります。