oracleテーブルのフィールドの自己成長

4225 ワード

分類:
データベース#データベース#

MySqlでは、フィールドが自己成長するかどうかを選択できます.ただしoracleテーブルにはこの機能はありません.フィールドを自己成長させるには、「
「シーケンス」と「
トリガ」を使用して実装します.
原理は以下の通りである.
フィールドAにレコードを挿入しようとすると、フリップフロップによりシーケンスが呼び出され、シーケンスの次の値が生成される.
シーケンス(SEQUENCE)は、シーケンス番号生成器であり、テーブル内の行に対してシーケンス番号を自動的に生成し、等間隔の数値(タイプは数値)のセットを生成することができる.主な目的は、テーブルのプライマリ・キー値を生成することです.挿入文で参照したり、クエリーで現在の値をチェックしたり、シーケンスを次の値に増やしたりすることができます.
CREATE SEQUENCE     [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}];

INCREMENT BYはシーケンスのステップ長を定義するために使用され、省略するとデフォルトは1で、負の値が発生すると、シーケンスを表す値はこのステップ長に従って減少します.
START WITHは、シーケンスの初期値(生成された最初の値)を定義し、デフォルトは1です.
MAXVALUEは、シーケンスジェネレータが生成できる最大値を定義します.オプションNOMAXVALUEはデフォルトのオプションで、最大値の定義がないことを表しています.この場合、インクリメントシーケンスでは、システムが生成できる最大値は10の27乗です.減算シーケンスの場合、最大値は-1です.
MINVALUEは、シーケンスジェネレータが生成できる最小値を定義します.オプションNOMAXVALUEはデフォルトのオプションで、最小値定義がないことを表します.この場合、減算シーケンスでシステムが生成できる最小値は?10の26次方;増分シーケンスの場合、最小値は1です.
CYCLEおよびNOCYCLEは、シーケンスジェネレータの値が制限値に達したときにループするかどうかを示す.CYCLEはループを表し、NOCYCLEは非ループを表す.ループの場合、増分シーケンスが最大値に達すると、最小値にループします.減算シーケンスが最小値に達した場合は、最大値にループします.ループしない場合、制限値に達した後、新しい値を生成し続けるとエラーが発生します.
CACHE(バッファ)は、格納シーケンスのメモリブロックのサイズを定義します.デフォルトは20です.NOCACHEはシーケンスをメモリバッファしないことを示します.シーケンスをメモリバッファリングすることで、シーケンスのパフォーマンスが向上します.
シーケンスの作成:
CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;
シーケンスを削除:
DROP SEQUENCE ABC;
説明:上記で作成したシーケンス名はABCで、増分シーケンスで、増分は1で、初期値は10です.このシーケンスはループせず、メモリは使用されません.最小値は定義されていません.デフォルトの最小値は1で、最大値は9,999,999です.
シーケンスの使用
シーケンスが作成されている場合は、シーケンスを参照するにはどうすればいいですか?メソッドは、CURRVALとNEXTVALを使用してシーケンスの値を参照します.
シーケンス名NEXTVAL
シーケンス名CURRVAL.
フリップフロップ
特定のイベントが発生したときに自動的に実行されるコードブロックです.きおくプロセスと同様ですが、ユーザーは直接呼び出すことはできません.
機能:
1、表の変更を許可/制限する
2、自増フィールドなどの派生列を自動的に生成する
3、データ整合性の強制
4、監査とログ記録の提供
5、無効な取引の防止
6、
複雑なビジネスロジックの有効化
トリガのコンポーネント:
1、トリガー名
2、トリガ文
3、トリガ制限
4、
トリガアクション
1、トリガー名
create trigger biufer_employees_department_id
命名習慣:
biufer(before insert update for each row)
employeesテーブル名
department_id列名
2、トリガ文
例:
表またはビューのDML文
DDL文
データベースの停止または起動、startup shutdownなど
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
説明:
1、department_が規定されているかどうかにかかわらずid,employeesテーブルをinsertする場合
2、employeesテーブルのdepartment_id列がupdateを行う場合
3、トリガ制限
when (new_value.department_id<>80 )
制限は必須ではありません.この例は、カラムdepartment_idが80に等しくない場合、トリガが実行されます.
その中のnew_valueは、更新後の値を表します.
4、トリガ操作
トリガの本体です
begin
:new_value.commission_pct :=0;
end;
本体は簡単ですが、更新後のcommission_pct列を0に設定
トリガー:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’Chen’,’Donny’, sysdate, 12, ‘[email protected]’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
トリガはユーザに通知せず,ユーザの入力値を変更する.
トリガのタイプ:
1、文トリガ
2、行トリガー
3、INSTAD OFトリガ
4、システム条件トリガ
5、
ユーザイベントトリガ成長ここでは、insert文に遭遇したときにトリガする文トリガを使用します.//構築テーブルcreate table DT_USER( ID NUMBER(10) not null, LOGIN_NAME VARCHAR2(255 CHAR), NAME VARCHAR2(255 CHAR), constraint USER_ID primary key(ID)//構築シーケンスcreate sequence SEQ_IDminvalue 1maxvalue 999999999999999999999999999start with 1increment by 1cache 20;//フリップフロップcreate or replace trigger Increase_を作成するGroupId before insert on dt_group for each rowwhen (NEW.ID IS NULL)declare -- local variables herebegin SELECT SEQ_ID.NEXTVAL INTO :NEW.ID FROM DUAL;end Increase_GroupId;実験:insert into DT_USER(LOGIN_NAME,NAME) values('Sunyu','hujun2')insert into DT_USER(LOGIN_NAME,NAME) values('Sunyu','hujun2')
転載先:http://blog.sina.com.cn/s/blog_5f54f0be0100f6f9.html