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

crea una tabella con sequence.nextval in Oracle

Oracolo 12c

Ora abbiamo finalmente IDENTITY colonne come molti altri database, nel caso in cui una sequenza viene generata automaticamente dietro le quinte. Questa soluzione è molto più veloce di una basata su trigger, come si può vedere in questo post del blog.

Quindi, la creazione della tua tabella sarebbe simile a questa:

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
);

Oracle 11g e inferiori

Secondo la documentazione, non puoi farlo:

Limitazione sui valori di colonna predefiniti Un'espressione DEFAULT non può contenere riferimenti a funzioni PL/SQL o ad altre colonne, le pseudocolonne CURRVAL, NEXTVAL, LEVEL, PRIOR e ROWNUM o costanti di data non completamente specificate.

Il modo standard per avere colonne di "incremento automatico" in Oracle consiste nell'utilizzare i trigger, ad es.

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;

Maggiori informazioni sugli Oracle TRIGGER nella documentazione