sql >> Databasteknik >  >> RDS >> Oracle

Uppdatera med trigger efter infogning på samma tabell

Om du vill tilldela ett enkelt standardvärde är det enklaste sättet att deklarera det på bordet med hjälp av DEFAULT-satsen.

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>

Detta fungerar med bokstavliga eller pseudokolumner som SYSDATE eller USER. Om du vill härleda ett mer komplicerat värde med en användardefinierad funktion eller en sekvens, måste du använda en trigger.

Här är en ny version av 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>

Observera att även om varje kolumn i tabellen är standard, måste jag fylla i minst en kolumn för att göra SQL giltig:

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


SQL>

Men jag kan skicka in NULL till COL4 för att få en fullständigt förvald post:

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>

Varning lector:min trigger använder den nya 11g-syntaxen. I tidigare versioner måste vi tilldela sekvensvärdet med hjälp av en SELECT-sats:

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


  1. MySql väljer standardvärde om det inte finns några resultat?

  2. Hur man sparar uppladdade bildnamn i MySQL-databasen

  3. SQL-ordning efter element från IN-sats

  4. mysqli_query() förväntar sig minst 2 parametrar &mysqli_query():Tomma frågefelmeddelanden