IDENTITY列の使用

Oracle NoSQL Databaseによって値が自動的に割り当てられるように、列をアイデンティティとして宣言します。この場合、値は順序ジェネレータから生成されます。順序ジェネレータを参照してください。

構文

identity_definition ::=
GENERATED (ALWAYS | (BY DEFAULT [ON NULL])) AS IDENTITY
["(" sequence_generator_attributes+ ")"]

セマンティクス

表内のINTEGER、LONG、またはNUMBER列は、アイデンティティ列として定義できます。システムでは、順序ジェネレータを使用して、アイデンティティ列の値を自動的に生成できます。順序ジェネレータの項を参照してください。アイデンティティ列の値は、INSERT、UPSERT、またはUPDATE文中に生成されます。

アイデンティティ列は、GENERATED ALWAYSまたはGENERATED BY DEFAULTのいずれかとして定義できます。

GENERATED ALWAYS

アイデンティティ列の値が常に生成されます。ユーザーがアイデンティティ列に値を指定した場合は、例外が発生します。

GENERATED BY DEFAULT

アイデンティティ列の値が生成されるのは、ユーザーがその値を指定しない場合のみです。GENERATED BY DEFAULTにON NULLを指定すると、ユーザーがNULL値を指定するか、値がNULLに評価されると、システムによって値が生成されます。

アイデンティティ列の特性

  • 表ごとに指定できるアイデンティティ列は1つのみです。
  • 表のアイデンティティ列は、主キーまたはシャード・キーの一部にできます。
  • 2次索引をアイデンティティ列に作成できます。
  • アイデンティティ列に割り当てることができる値のセットは、そのデータ型とアタッチされている順序ジェネレータの属性によって定義されます。値は常に整数です。負と正の両方のINTEGERを指定できます。正の値のみが必要な場合は、START WITH属性を1に設定し、正のINCREMENT BY属性を指定します。CYCLEを指定すると、数値がMINVALUEから再生成されます。この場合、正の値が必要な場合は、MINVALUEも正の数値に設定する必要があります。
  • GENERATED ALWAYSとして定義されたアイデンティティ列に対して一意の値が生成され、順序ジェネレータ属性NO CYCLEが設定されます。そうしないと、次のシナリオでアイデンティティ値の重複が発生する可能性があります。
    • アイデンティティ列がGENERATED BY DEFAULTとして定義され、ユーザーがアイデンティティ列の表にすでに存在するinsert文またはupdate文で値を指定します。
    • CYCLEオプションがGENERATED BY DEFAULTまたはGENERATED ALWAYSとして定義されたアイデンティティ列に設定されており、順序ジェネレータがサイクルの終わりに到達した後、順序ジェネレータを使用して再利用され、前のサイクルで生成された値が生成されます。
    • 挿入または更新操作時にユーザーがすでに存在する値を指定できるように、alter table文を使用してアイデンティティ列プロパティが変更された場合。
  • 順序ジェネレータの属性は、alter table文を使用して変更できます。
  • 順序内のホールは、次の場合に発生する可能性があります。
    • キャッシュされたすべての値を使用して行を挿入する前に、アプリケーションでアイデンティティ値がキャッシュされ、停止またはクラッシュします。
    • アイデンティティ値が、ロールバックされるトランザクション中に割り当てられます。
  • アイデンティティ列を含む行の挿入の例は、IDENTITY列を含む行の挿入の項を参照してください。

例5-9 GENERATED ALWAYSを使用するアイデンティティ列

CREATE TABLE T1 (
    id INTEGER GENERATED ALWAYS AS IDENTITY
    (START WITH 2 INCREMENT BY 2 MAXVALUE 200 NO CYCLE),
    name STRING,
    PRIMARY KEY (id)
);

上の例では、INTEGER列のidがGENERATED ALWAYS AS IDENTITY列として定義され、表Tの主キーになっています。増分2で2から200の値の生成が開始されます。そのため、id列の値は2、4、6、8、... 200となります。NO CYCLEオプションが定義されているため、順序ジェネレータの最後に達したことを示す数値200が生成された後に例外が発生します。

例5-10 GENERATED BY DEFAULTを使用するアイデンティティ列

CREATE TABLE T2 (
    id LONG GENERATED BY DEFAULT AS IDENTITY
    (START WITH 1 INCREMENT BY 1 CYCLE CACHE 200),
    account_id INTEGER,
    name STRING,
    PRIMARY KEY (account_id)
);

上の例では、id列のアイデンティティ列を使用した表の作成を示しています。id列のタイプはLONGで、GENERATED BY DEFAULTとして定義され、主キー列ではありません。この例では、CYCLEおよびCACHE順序ジェネレータ属性を指定する方法も示しています。ユーザーが値を指定しなかった場合にのみ、INSERT/UPSERT/UPDATE中に値が生成されます。最初に、LONGデータ型の最大値まで1、2、3、...のように値が生成されます。すべての順序ジェネレータ値が使用されると、順序ジェネレータのMINVALUE値からサイクルおよび再開されます。この場合、MINVALUE値はLONGデータ型の最小値です。CACHE値が200の場合は、クライアントがキャッシュ内のすべての値を使用し、次の値を要求するたびに、キャッシュに200個の値が付与されます。この例では、クライアントが初めて値を要求した場合、1から200の値が付与されます。同じ表を操作している別のクライアントが値201から300などを取得する場合があります。