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

同じテーブルの挿入後トリガーで更新

    単純なデフォルト値を割り当てたい場合、最も簡単な方法は、DEFAULT句を使用してテーブル上でそれを宣言することです。

    SQL> create table t42
      2    ( col1 number default 1 not null
      3      , col2 date)
      4  /
    
    Table created.
    
    SQL> insert into t42 (col2) values (sysdate)
      2  /
    
    1 row created.
    
    SQL> select * from t42
      2  /
    
          COL1 COL2
    ---------- ---------
             1 03-AUG-11
    
    SQL>
    

    これは、SYSDATEやUSERなどのリテラルまたは疑似列で機能します。ユーザー定義の関数またはシーケンスを使用してより複雑な値を導出する場合は、トリガーを使用する必要があります。

    これがテーブルの新しいバージョンです...

    SQL> create table t42
      2    ( col1 number default 1 not null
      3      , col2 date default sysdate
      4      , col3 varchar2(30) default user
      5      , col4 number )
      6  /
    
    Table created.
    
    SQL>
    

    ...トリガー付き:

    SQL> create or replace trigger t42_trg
      2      before insert or update
      3      on t42
      4      for each row
      5  begin
      6      if :new.col4 is null
      7      then
      8          :new.col4 := my_seq.nextval;
      9      end if;
     10  end;
     11  /
    
    Trigger created.
    
    SQL> insert into t42 (col1, col2, col3)
      2  values (99, sysdate, 'MR KNOX')
      3  /
    
    1 row created.
    
    SQL> select * from t42
      2  /
    
          COL1 COL2      COL3                                 COL4
    ---------- --------- ------------------------------ ----------
            99 03-AUG-11 MR KNOX                               161
    
    SQL>
    

    テーブルのすべての列はデフォルト設定可能ですが、SQLを有効にするには、少なくとも1つの列にデータを入力する必要があることに注意してください。

    SQL> insert into t42 values ()
      2  /
    insert into t42 values ()
                            *
    ERROR at line 1:
    ORA-00936: missing expression
    
    
    SQL>
    

    しかし、NULLをCOL4に渡して、完全にデフォルトのレコードを取得することはできます:

    SQL> insert into t42 (col4) values (null)
      2  /
    
    1 row created.
    
    SQL> select * from t42
      2  /
    
          COL1 COL2      COL3                                 COL4
    ---------- --------- ------------------------------ ----------
            99 03-AUG-11 MR KNOX                               161
             1 03-AUG-11 APC                                   162
    
    SQL>
    

    警告レクター:私のトリガーは新しい11g構文を使用しています。以前のバージョンでは、SELECTステートメントを使用してシーケンス値を割り当てる必要があります:

    select my_seq.nextval
    into :new.col4
    from dual;
    


    1. AVG()を使用したMySQLクエリの問題

    2. 誰かがMagentosインデックス機能を詳細に説明できますか?

    3. MySQL挿入ステートメント(テーブル(列)に挿入selectステートメント)

    4. PostgreSQLの「INSERTにはターゲット列よりも多くの式があります」を修正しました