sql >> Databasteknik >  >> RDS >> Oracle

Oracle-utlösare för att skapa en autonumrering

Något liknande kommer att fungera på 11g

CREATE SEQUENCE t1_id_seq 
  start with 10000 
  increment by 1;

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    :new.id := t1_id_seq.nextval;
  END IF;
END;

Om du använder en tidigare version måste du göra en SELECT INTO för att få nästa värde från sekvensen

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    SELECT t1_id_seq.nextval
      INTO :new.id
      FROM dual;
  END IF;
END;

Var medveten om att Oracle-sekvenser inte är mellanrumsfria. Så det är fullt möjligt att vissa värden kommer att hoppas över av olika anledningar. Din första infogning kan ha ett ID på 10000 och den andra kan ha ett ID på 10020 om det görs minuter, timmar eller dagar senare.

Tänk dessutom på att Oracle inte stöder att specificera flera rader i VALUES-satsen som MySQL gör. Så hellre än

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')

du skulle behöva två separata INSERT-satser

insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');


  1. Skapar en främmande nyckel automatiskt ett index?

  2. Hur KOPIERA IMPORTERA en json-fil till postgres?

  3. Är det möjligt att stänga av offertbehandling i Postgres COPY-kommandot med CSV-format?

  4. SQL-uppdatering med row_number()