sql >> データベース >  >> RDS >> Oracle

Oracleで自動インクリメント主キーを定義する方法

    2014年半ばのOracleバージョン12cより前の、世界中のデータベース管理者の不満の多くは、Oracleには、テーブルスキーマ内に自動インクリメント列を本質的に生成する固有の機能がなかっただけです。この設計上の決定の理由は推測することしかできませんが、幸いなことに、古いOracleシステムのユーザーでも、この落とし穴を回避して、自動インクリメントされた独自の主キー列を作成するための回避策が考えられます。

    シーケンスの作成

    最初のステップは、SEQUENCEを作成することです データベース内。これは、複数のユーザーがアクセスして増分値を自動的に生成できるデータオブジェクトです。ドキュメントで説明されているように、Oracleのシーケンスは、各連続アイテムが生成される前に複数のユーザーが効果的に「交代」することを強制されるため、重複する値が同時に作成されるのを防ぎます。

    新しいテーブルの一意の主キーを作成するには、最初にCREATEを実行する必要があります。 使用するテーブル:

    CREATE TABLE books (
      id      NUMBER(10)    NOT NULL,
      title   VARCHAR2(100) NOT NULL
    );
    

    次に、PRIMARY KEYを追加する必要があります 制約:

    ALTER TABLE books
      ADD (
        CONSTRAINT books_pk PRIMARY KEY (id)
      );
    

    最後に、SEQUENCEを作成します これは後で実際に一意の自動インクリメント値を生成するために使用されます。

    CREATE SEQUENCE books_sequence;
    
    トリガーの追加

    テーブルを作成して準備ができている間、シーケンスはこれまでのところそこに座っているだけですが、使用されることはありません。ここでTRIGGERS 入ってください。

    eventに似ています 最新のプログラミング言語では、TRIGGER Oracleでは、特定のイベントが発生したときに実行されるストアドプロシージャです。

    通常、TRIGGER テーブルが更新されたとき、またはレコードが削除されたときに起動するように構成され、必要に応じて少しクリーンアップします。

    この例では、TRIGGERを実行します。 INSERTの前 私たちのbooksに テーブル、SEQUENCEを確認します がインクリメントされ、その新しい値が主キー列に渡されます。

    CREATE OR REPLACE TRIGGER books_on_insert
      BEFORE INSERT ON books
      FOR EACH ROW
    BEGIN
      SELECT books_sequence.nextval
      INTO :new.id
      FROM dual;
    END;
    

    ここでは、TRIGGERを作成(または存在する場合は置換)しています。 名前付きbooks_on_insert トリガーをBEFORE INSERTで起動するように指定します booksに対して発生します テーブル、およびその中のすべての行に適用できます。

    トリガー自体の「コード」は非常に単純です。SELECT 以前に作成したbooks_sequenceからの次の増分値 SEQUENCE 、それを:newに挿入します booksの記録 指定された.idのテーブル フィールド。

    注:FROM dual 一部は適切なクエリを完了するために必要ですが、事実上無関係です。 dual テーブルはデータの単一のダミー行であり、この場合は追加されます。これは無視できるようにするためであり、代わりに、ある種のデータを返すのではなく、トリガーのシステム関数を実行できます。

    IDENTITY列

    IDENTITY 列はOracle12cで導入され、最新バージョンのOracleで単純な自動インクリメント機能を使用できるようになりました。

    IDENTITYを使用する 列は、他のデータベースシステムの列と機能的に類似しています。上記のbooksを再作成する 最新のOracle12c以降のテーブルスキーマでは、次の列定義を使用するだけです。

    CREATE TABLE books (
      id      NUMBER        GENERATED BY DEFAULT ON NULL AS IDENTITY,
      title   VARCHAR2(100) NOT NULL
    );
    

    1. 非オブジェクトのプロパティを取得しようとしています-CodeIgniter

    2. Postgresqlの奇妙な動作

    3. データベース要約レポートを送信する自動電子メールシステム

    4. SQL Server:複数の行を1つの行に結合