sql >> Database teknologi >  >> RDS >> Oracle

Opdater med trigger efter indsættelse på samme tabel

Hvis du vil tildele en simpel standardværdi, er den nemmeste måde at erklære den på bordet ved at bruge DEFAULT-sætningen.

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>

Dette fungerer med bogstaver eller pseudokolonner såsom SYSDATE eller USER. Hvis du vil udlede en mere kompliceret værdi med en brugerdefineret funktion eller en sekvens, skal du bruge en trigger.

Her er en ny version af tabellen...

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>

... med en trigger:

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>

Bemærk, at selvom hver kolonne i tabellen er standard, skal jeg udfylde mindst én kolonne for at gøre SQL gyldig:

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


SQL>

Men jeg kan sende NULL til COL4 for at få en fuldstændig standardpost:

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>

Advarsel lector:min trigger bruger den nye 11g-syntaks. I tidligere versioner skal vi tildele sekvensværdien ved hjælp af en SELECT-sætning:

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


  1. MySQL afviser kolonne med ON DELETE SET NULL, men ikke ON DELETE CASCADE

  2. PostgreSQL:Vis tabeller i PostgreSQL

  3. MySQL flere fremmednøgler

  4. Kan nogen forklare denne forespørgsel?