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

自動インクリメント列–Oracleのデフォルト値としてのシーケンス

    Auto Increment Columnは、コーディングにおける非常に一般的な要件です。 Oracleでそれを取得する方法のいくつかを次に示します

    Oracleでの自動インクリメント

    この機能(Oracle Auto Increment Column –デフォルト値としてのシーケンス)は、これまでのところOracleデータベースには存在しません。しかし、12cを使用すると、オラクルはそれを提供できます。

    挿入時にシーケンスを自動インクリメントする必要があるOracleテーブルを設定するとします。それを達成する方法はたくさんあります

    オプション1
    Oracle 12cより前は、トリガーを挿入する前に使用する必要があります

    create table test_lab
    (
    id number primary key
    name varchar (10)
    );
    
    create sequence test_lab_seq start with 1 increment by 1 nocycle;
    
    create or replace trigger test_lab_bef_auto
    before insert on test_lab
    for each row
    begin
    select test_lab_seq.nextval into :new.id
    from dual;
    end;
    /

    または

    create or replace trigger test_lab_bef_auto
    before insert on test_lab
    for each row
    begin
    :new.id := test_lab_seq.nextval;
    end;
    /

    トリガーでidがnullになるタイミングを指定して、挿入ステートメントにid列の値がある場合のエラーを回避できます

    insert into test_lab values ('john');
    insert into test_lab values ('scott');
    insert into test_lab values ('bill');
    insert into test_lab values ('tom');
    insert into test_lab values ('Duke');
    commit;
    select * from test_lab;

    オプション2:
    Oracle 12cを使用すると、列のデフォルト値としてシーケンスnextvalを直接割り当てることができるため、列にシーケンスの次の値を入力するトリガーを作成する必要がなくなり、次のように宣言するだけで済みます。テーブルの定義。

    create sequence test_lab_seq start with 1 increment by 1 nocycle;
    
    create table test_lab
    (
    id number default test_lab_seq.nextval primary key
    );
    
    insert into test_lab values ('Cat1');
    insert into test_lab values ('Cat2');
    insert into test_lab values ('Cat3');
    insert into test_lab values ('Cat4');
    insert into test_lab values ('Cat5');
    commit;
    select * from test_lab;

    オプション3
    12cでは、識別機能を使用できます

    create table test_lab (
    id number(10) GENERATED AS IDENTITY,
    name varchar(15)
    );
    Table created.
    
    Desc TEST_LAB
    Name Null? Type
    ---- ----   ----
    ID NOT NULL NUMBER(10)
    NAME VARCHAR2(15)
    • NOTNULL制約がIdentity列に自動的に課されていることがわかります
    • Oracleは内部的にシーケンスを使用して、自動インクリメント列の値を設定します。
    insert into test_lab values ('London');
    insert into test_lab values ('New york');
    insert into test_lab values ('Tokyo');
    insert into test_lab values ('Delhi');
    insert into test_lab values ('Bangalore');
    commit;
    select * from test_lab;

    関連するOracleSQLの記事

    Oracleでテーブルを作成する方法
    Oracleビューを作成する方法
    Top-Nクエリとページネーション
    SQLクエリを作成する方法
    OracleSQLデコード処理


    1. YEARWEEK()の例– MySQL

    2. PL/SQLで例外を処理する方法を学ぶ

    3. Oracleによるページング

    4. Oracleのフィールドデータが数値タイプであるかどうかの判断