UUIDデータ型の使用
UUIDデータ型の概要
UUID (universally unique identifier)は、コンピュータ・システム内の情報を識別するために使用される128ビットの数値です。UUIDを作成して使用することで、あるものを一意に識別できます。その正規のテキスト表現では、UUIDの16オクテットは32桁の16進数(base-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型を保持するものとして宣言できます。UUIDデータ型は、複数のリージョンにわたる表のレコードに対してグローバルに一意な識別子が必要な場合に最適です。これは、ID列がリージョン内のNoSQLクラスタ内でのみ一意であることが保証されるためです。
UUIDデータ型の使用:
UUIDデータ型の列を宣言します。UUIDは、STRINGデータ型のサブタイプです。このUUID列は、GENERATED BY DEFAULTとして定義できます。そのようにすると、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列のみを含めることができます。
- ID列もシステムによって生成されるため、ID列とUUID GENERATED BY DEFAULT列は相互に排他的です。つまり、表ごとに1つのIDENTITY列または1つのUUID GENERATED BY DEFAULTのみが存在できるということです。
- UUID列は、CREATE TABLE DDL文の一部として作成するか、ALTER TABLE DDL文で既存の表に追加します。
- また、セカンダリ索引を通じて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で規定されている形式に準拠する必要があります。入力文字列がClass UUIDで説明している文字列表現に準拠していない場合は、IllegalArgumentExceptionがスローされます
出力形式: 出力はUUID正規形式です。これは32桁の16進数(base-16)で、8-4-4-4-12形式のハイフンで区切られた5つのグループで表示されます。合計は36文字(32桁の16進数文字および4つのハイフン)になります。
UUID列の値は、random_uuid
関数を使用して生成することもできます。この関数は、36文字の文字列としてランダムに生成された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
表3-1 ID列とUUID列の比較
ID列 | UUID列 |
---|---|
列をIdentityとして宣言して、Oracle NoSQL Clusterによって列に値が自動的に割り当てられるようにします。 | 複数リージョン・システムでNoSQLクラスタ列に一意の値を割り当てる必要がある場合は、列をUUIDとして宣言します。 |
表内のINTEGER列、LONG列またはNUMBER列は、アイデンティティ列として定義できます | UUIDはSTRINGデータ型のサブタイプです |
ID列は、GENERATED ALWAYSまたはGENERATED BY DEFAULTのどちらかとして定義できます | UUID列はGENERATED BY DEFAULTとして定義することも、データの挿入時または更新時に文字列の値を指定することもできます |
単一のクラスタ・アーキテクチャでは理想的です | UUIDデータ型は、複数のリージョンにわたる表のレコードに対してグローバルに一意な識別子が必要な場合に最適です。これは、ID列がリージョン内のNoSQLクラスタ内でのみ一意であることが保証されるためです。 |
同等のUUID列よりもストレージ領域のコストが少なくなります。 LONGが主キーの場合、最大10バイトのコストがかかります。LONGが主キー以外の場合、最大8バイトのコストがかかります。 |
同等のID列よりもストレージ領域のコストが多くなります。 UUID値が主キーの場合、19バイトのコストがかかります。UUID値が主キー以外の場合、16バイトのコストがかかります。 |