Orcalの自己増加シーケンス
3439 ワード
基本的にすべてのデータベースは今idの自増を支持して、どうしてorcalのこのようなデータベースのリーダーは支持しないことを知らないで、しかしちょうど1つの比較的に良い解決方法を耳にします:シーケンス、また上にトリガをプラスすることができて、下は1人の知らないネットユーザーの紹介を転載して、すでに予備を残して、みんなに役に立つことを望みます:
以下の記事では、主にOracleシーケンスとトリガの使用方法について説明します.本題が始まる前に、Oracle client sqlplusの具体的な使用について追加します.つまり、複数行の文を実行する場合は、終了を表すために必ず「/」を追加し、実行しなければなりません.
今回の目的は、Oracleシーケンスとトリガを作成することによって、テーブルのプライマリ・キーの自己増加を実現することです.
まず、Oracleシーケンスを作成します.シーケンスの構文フォーマットは次のとおりです.
CREATE SEQUENCEシーケンス名
INCREMENT BYはシーケンスのステップ長を定義するために使用され、省略するとデフォルトは1で、負の値が発生すると、シーケンスを表す値はこのステップ長に従って減少します.
START WITHは、Oracleシーケンスの初期値(生成された最初の値)を定義し、デフォルトは1です.
MAXVALUEは、シーケンスジェネレータが生成できる最大値を定義します.オプションNOMAXVALUEはデフォルトのオプションで、最大値の定義がないことを表しています.この場合、インクリメントシーケンスでは、システムが生成できる最大値は10の27乗です.減算シーケンスの場合、最大値は-1です.
MINVALUEは、シーケンスジェネレータが生成できる最小値を定義します.オプションNOMAXVALUEはデフォルトのオプションで、最小値定義がないことを表します.この場合、減算シーケンスでシステムが生成できる最小値は?10の26次方;増分シーケンスの場合、最小値は1です.
CYCLEおよびNOCYCLEは、シーケンスジェネレータの値が制限値に達したときにループするかどうかを示す.CYCLEはループを表し、NOCYCLEは非ループを表す.ループの場合、増分シーケンスが最大値に達すると、最小値にループします.減算シーケンスが最小値に達した場合は、最大値にループします.ループしない場合、制限値に達した後、新しい値を生成し続けるとエラーが発生します.
CACHE(バッファ)は、格納シーケンスのメモリブロックのサイズを定義します.デフォルトは20です.NOCACHEはシーケンスをメモリバッファしないことを示します.シーケンスをメモリバッファリングすることで、シーケンスのパフォーマンスが向上します.
削除シーケンスの構文はDROP SEQUENCEシーケンス名です.
テーブルTESTがあると仮定し、そのプライマリ・キーはTEST_である.ID、最初に増分OracleシーケンスSEQ_を確立するTEST:
次に、データがテーブルTESTに挿入されたときに、シーケンスを使用して増加したプライマリ・キー値を使用するトリガを確立する.
これで作成完了です!
もちろん、トリガを使用するのではなく、挿入時にsql文でOracleシーケンスを呼び出すこともできます.たとえば、
以下の記事では、主にOracleシーケンスとトリガの使用方法について説明します.本題が始まる前に、Oracle client sqlplusの具体的な使用について追加します.つまり、複数行の文を実行する場合は、終了を表すために必ず「/」を追加し、実行しなければなりません.
今回の目的は、Oracleシーケンスとトリガを作成することによって、テーブルのプライマリ・キーの自己増加を実現することです.
まず、Oracleシーケンスを作成します.シーケンスの構文フォーマットは次のとおりです.
CREATE SEQUENCEシーケンス名
- [INCREMENT BY n]
- [START WITH n]
- [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
- [{CYCLE|NOCYCLE}]
- [{CACHE n|NOCACHE}];
INCREMENT BYはシーケンスのステップ長を定義するために使用され、省略するとデフォルトは1で、負の値が発生すると、シーケンスを表す値はこのステップ長に従って減少します.
START WITHは、Oracleシーケンスの初期値(生成された最初の値)を定義し、デフォルトは1です.
MAXVALUEは、シーケンスジェネレータが生成できる最大値を定義します.オプションNOMAXVALUEはデフォルトのオプションで、最大値の定義がないことを表しています.この場合、インクリメントシーケンスでは、システムが生成できる最大値は10の27乗です.減算シーケンスの場合、最大値は-1です.
MINVALUEは、シーケンスジェネレータが生成できる最小値を定義します.オプションNOMAXVALUEはデフォルトのオプションで、最小値定義がないことを表します.この場合、減算シーケンスでシステムが生成できる最小値は?10の26次方;増分シーケンスの場合、最小値は1です.
CYCLEおよびNOCYCLEは、シーケンスジェネレータの値が制限値に達したときにループするかどうかを示す.CYCLEはループを表し、NOCYCLEは非ループを表す.ループの場合、増分シーケンスが最大値に達すると、最小値にループします.減算シーケンスが最小値に達した場合は、最大値にループします.ループしない場合、制限値に達した後、新しい値を生成し続けるとエラーが発生します.
CACHE(バッファ)は、格納シーケンスのメモリブロックのサイズを定義します.デフォルトは20です.NOCACHEはシーケンスをメモリバッファしないことを示します.シーケンスをメモリバッファリングすることで、シーケンスのパフォーマンスが向上します.
削除シーケンスの構文はDROP SEQUENCEシーケンス名です.
テーブルTESTがあると仮定し、そのプライマリ・キーはTEST_である.ID、最初に増分OracleシーケンスSEQ_を確立するTEST:
- create sequence SEQ_TEST
- increment by 1
- start with 1
- minvalue 1 nomaxvalue
- nocylce
次に、データがテーブルTESTに挿入されたときに、シーケンスを使用して増加したプライマリ・キー値を使用するトリガを確立する.
- create trigger TRG_TEST before insert on TEST
- for each row
- begin
- select SEQ_TEST.nextval into :new.TEST_ID from dual;
- end;
これで作成完了です!
もちろん、トリガを使用するのではなく、挿入時にsql文でOracleシーケンスを呼び出すこともできます.たとえば、
- insert into TEST values(SEQ_TEST.nextval, ……) ;