Oracle自己成長プライマリ・キーの3つの方法

2810 ワード

oracleは表空間を建てて、表を建ててPL/SQLを借りて作成することができて、とても実用的です.MySqlでフィールド定義の後にAUTO_を使用INCREMENTプロパティは自己成長を実現し、Oracleはどのように自己成長プライマリ・キーを実現しますか?3つの方法を紹介する
一、シーケンス
   sequence   
  create   sequence   sequence_name   
  minvalue   1   
  maxvalue   99999999
  start   with   1   
  increment  by 1   
  cache   20 

IDの自己成長が一定長で識別可能である場合、to_を使用することができるcharフォーマット関数ヘルプドキュメントhttp://download.csdn.net/detail/l3922768721/9557926無料ダウンロード
Select 'Goods'||trim(to_char(mw_pos.seq_goodsid.nextval,'0009999999')) From dual
挿入時
insert into table_name(id,col2) values(sequence_name.nextval,'test');
実行
二、シーケンス+トリガ
1.シーケンスは、上記2のように作成する.トリガ
create or replace trigger trg_insert_id
before insert on tablename
for each row
BEGIN
select sequence_name.nextval into :new.id from dual;
END;
の作成
挿入時にidフィールドを考慮する必要がなく、以下のように実行すればよい.
insert   into   table_name(col2)   values('test');

三、ユニークシーケンスSYS_GUID()
select sys_guid() from dual

SYS_GUID()は32ビットの一意符号化を生成する.
2つのシステムを統合する場合、上記の自己成長プライマリ・キーが重複し、統合の維持に不利になる可能性があります.したがって、自己成長プライマリ・キーに加えて、通常、実際に適用される場合、プライマリ・キーとして一意のシーケンスが使用される(oracle:SYS_GUID()、mysql:UUID()
シーケンスジェネレータによって生成される数値は、単一のインスタンスで一意であることを保証するだけで、パラレルまたはリモート環境のプライマリ・キーとして使用するのは適切ではありません.それぞれの環境のシーケンスが同じ数値を生成し、競合を引き起こす可能性があるためです.SYS_GUIDは、作成された識別子が各データベースで一意であることを保証します.
さらに、シーケンスはDML記述の一部でなければならないため、データベースへの往復プロセスが必要です(そうでなければ、値が一意であることは保証されません).
SYS_GUIDはデータベースにアクセスするタイムスタンプやマシン識別子を必要とせず、クエリーの消費を節約します.
多くのアプリケーションは、シーケンスジェネレータに依存してデータ行のプライマリ・キーを作成します.これらのデータ行には明らかなプライマリ値はありません.つまり、このようなデータセットでは、レコードの作成によってデータ列が変更されます.したがって、管理者は、テーブル内でSYS_をGUIDはシーケンス数ではなくメインキーとして使用されることに興味がある.これは、オブジェクトが異なるマシンの異なるデータベースで生成され、後で統合する必要がある場合に役立ちます.
SYSの使用GUIDまたはシーケンスは、データベースの使用サイクルの一部でパフォーマンスの消費をもたらします.問題はそこにある.SYS_についてGUIDの場合、パフォーマンス上の影響はクエリー時間と作成時間(テーブルにデータを格納するためにより多くのブロックとインデックスを作成する)にあります.シーケンスにとって,性能上の影響はクエリ中にSGAシーケンスのバッファが用いられる.デフォルトでは、シーケンスは一度に20個の値をバッファリングします.データベースがこれらの値を使用せずに閉じられると、失われます.
SYS_GUIDが生成する値のもう一つの大きな欠点は、これらの値の管理が困難になることです.スクリプトで入力するか、Webパラメータとして渡す必要があります.これらの理由からSYS_GUIDはメインキーワードとして良いアイデアではありません.パラレル環境または管理シーケンスジェネレータの使用を回避したい場合を除きます.