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

Oracleでsequence.nextvalを使用してテーブルを作成します

    Oracle 12c

    ついにIDENTITYができました 他の多くのデータベースと同様に、シーケンスがバックグラウンドで自動生成される場合の列。このブログ投稿に見られるように、このソリューションはトリガーベースのソリューションよりもはるかに高速です。

    したがって、テーブルの作成は次のようになります。

    CREATE TABLE qname
    (
        qname_id integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL PRIMARY KEY,
        qname    VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
    );
    

    Oracle11g以下

    ドキュメントによると、それはできません:

    デフォルトの列値の制限DEFAULT式には、PL / SQL関数または他の列、疑似列CURRVAL、NEXTVAL、LEVEL、PRIOR、およびROWNUM、あるいは完全に指定されていない日付定数への参照を含めることはできません。

    Oracleで「自動インクリメント」列を使用する標準的な方法は、トリガーを使用することです。例:

    CREATE OR REPLACE TRIGGER my_trigger
      BEFORE INSERT 
      ON qname
      FOR EACH ROW
      -- Optionally restrict this trigger to fire only when really needed
      WHEN (new.qname_id is null)
    DECLARE
      v_id qname.qname_id%TYPE;
    BEGIN
      -- Select a new value from the sequence into a local variable. As David
      -- commented, this step is optional. You can directly select into :new.qname_id
      SELECT qname_id_seq.nextval INTO v_id FROM DUAL;
    
      -- :new references the record that you are about to insert into qname. Hence,
      -- you can overwrite the value of :new.qname_id (qname.qname_id) with the value
      -- obtained from your sequence, before inserting
      :new.qname_id := v_id;
    END my_trigger;
    

    ドキュメントでOracleTRIGGERの詳細を読む



    1. MySQL DATEDIFF()とTIMESTAMPDIFF():違いは何ですか?

    2. デフォルトでは、ORACLE11gの大文字と小文字は区別されません

    3. PostgreSQLのフォールトトレランスの進化

    4. SQL Serverで「datetimeoffset」を「time」に変換します(T-SQLの例)