IDENTITY列の使用

Oracle NoSQL Databaseによって値が自動的に割り当てられるように、列をIDENTITYとして宣言します。この場合、値は関連付けられた順序ジェネレータから生成されます。SGは、IDENTITY列の現在の値、次の値および値の合計数を追跡するための表のマネージャです。

IDENTITY列をCREATE TABLE name DDL文の一部として作成するか、ALTER TABLE name DDL文を使用して既存の表にIDENTITY列を追加します。

構文

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に評価されると、システムによって値が生成されます。

順序ジェネレータの属性

SGには、その動作を定義する複数の属性(IDENTITY列の開始値や、キャッシュに格納される値の数など)があります。オプションで、IDENTITY列を作成する際に一部のSGの属性を定義したり、すべてのデフォルト値を使用できます。順序ジェネレータの属性の詳細は、順序ジェネレータを参照してください。

ノート:

表内でIDENTITY列を使用しても、一意性は強制的には適用されません。アプリケーションでIDENTITY列のすべての行に一意の値が必要な場合は、その列をGENERATED ALWAYS AS IDENTITYとして作成する必要があり、CYCLE SG属性の使用を決して許可しないでください。

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

  • 表ごとに指定できるIDENTITY列は1つのみです。
  • 表のIDENTITY列は、主キーまたはシャード・キーの一部にできます。
  • IDENTITY列は追加、削除または変更できますが、IDENTITY列の作成方法、およびIDENTITY列が主キーかどうかに応じて、そのような更新に対する特定の制限が存在します。
  • 2次索引をアイデンティティ列に作成できます。
  • IDENTITY列を使用して作成された表を削除すると、シーケンス・ジェネレータも削除されます。
  • IDENTITY列に割り当てることができる値のセットは、そのデータ型とアタッチされている順序ジェネレータの属性によって定義されます。値は常に整数です。負と正の両方のINTEGERを指定できます。正の値のみが必要な場合は、START WITH属性を1に設定し、正のINCREMENT BY属性を指定します。CYCLEを指定すると、数値がMINVALUEから再生成されます。この場合、正の値が必要な場合は、MINVALUEも正の数値に設定する必要があります。
  • GENERATED ALWAYSとして定義されたIDENTITY列に対して一意の値が生成され、順序ジェネレータ属性NO CYCLEが設定されます。そうしないと、次のシナリオでアイデンティティ値の重複が発生する可能性があります。
    • アイデンティティ列がGENERATED BY DEFAULTとして定義されていて、表のIDENTITY列に値がすでに存在するが、ユーザーがinsert文またはupdate文で値を指定します。
    • GENERATED BY DEFAULTまたはGENERATED ALWAYSとして定義されたIDENTITY列にCYCLEオプションが設定されており、順序ジェネレータがサイクルの終わりに到達した後、順序ジェネレータを使用して再利用され、前のサイクルで生成された値が生成されます。
    • 挿入または更新操作時にユーザーがすでに存在する値を指定できるように、alter table文を使用してIDENTITY列プロパティが変更された場合。
  • 複数のクライアントが、このように一意の値について定義されたIDENTITY列を持つ表にアクセスする場合、各クライアントには、連続した値セットがそのSGキャッシュに割り当てられます。これらのセットは、他のクライアント・セットと重複しません。たとえば、Client1には値0001 – 1000、Client2には1001 – 2000、などと割り当てられます。したがって、各クライアントが表に行を追加するにつれて、どちらのクライアントも行を追加するときに独自のキャッシュを使用するため、IDENTITY値は00011001000210021003などのようになる可能性があります。IDENTITY列の値は、一意であることが保証されていますが、各クライアントに独自のキャッシュ値のセットがあり、異なる速度で異なる時間に行が追加されるため、必ずしも連続しているとはかぎりません。
  • 順序ジェネレータの属性は、alter table文を使用して変更できます。
  • ユーザーには、IDENTITY列を持つ表を作成するために表権限が必要です。ユーザー権限の詳細は、セキュリティ・ガイドKVStore必須権限を参照してください。
  • 順序内のホールは、次の場合に発生する可能性があります。
    • キャッシュされたすべての値を使用して行を挿入する前に、アプリケーションでアイデンティティ値がキャッシュされ、停止またはクラッシュします。
    • アイデンティティ値が、ロールバックされるトランザクション中に割り当てられます。
  • IDENTITY列を持つMR表を作成することはサポートされていないため、エラー・メッセージが返されます。MR表の作成の詳細は、MR表の作成を参照してください。
  • アイデンティティ列を含む行の挿入の例については、IDENTITY列を含む行の挿入の項を参照してください。

例5-17 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-18 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などを取得する場合があります。