sql >> Database >  >> RDS >> Oracle

maak een tabel met sequence.nextval in oracle

Oracle 12c

We hebben nu eindelijk IDENTITY kolommen zoals veel andere databases, waarbij achter de schermen automatisch een sequentie wordt gegenereerd. Deze oplossing is veel sneller dan een op triggers gebaseerde oplossing, zoals te zien is in deze blogpost.

Uw tafelcreatie zou er dus als volgt uitzien:

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 en lager

Volgens de documentatie kun je dat niet doen:

Beperking op standaardkolomwaarden Een DEFAULT-expressie mag geen verwijzingen bevatten naar PL/SQL-functies of naar andere kolommen, de pseudokolommen CURRVAL, NEXTVAL, LEVEL, PRIOR en ROWNUM, of datumconstanten die niet volledig zijn gespecificeerd.

De standaardmanier om "auto-increment"-kolommen in Oracle te hebben, is door triggers te gebruiken, bijv.

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;

Lees meer over Oracle TRIGGER's in de documentatie



  1. Hoe te bestellen op twee kolommen in SQL?

  2. Benchmarking databases 101 - deel 1

  3. SQL (ORACLE):ORDER BY en LIMIT

  4. Een rapport groeperen in Access 2016