Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyzwalacz Oracle do tworzenia autonumeracji

Coś takiego będzie działać na 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;

Jeśli korzystasz z wcześniejszej wersji, musisz wykonać SELECT INTO, aby uzyskać następną wartość z sekwencji

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;

Należy pamiętać, że sekwencje Oracle nie są pozbawione przerw. Jest więc całkiem możliwe, że poszczególne wartości zostaną pominięte z różnych powodów. Twoja pierwsza wstawka może mieć identyfikator 10000, a druga może mieć identyfikator 10020, jeśli zrobisz to kilka minut, godzin lub dni później.

Ponadto należy pamiętać, że Oracle nie obsługuje określania wielu wierszy w klauzuli VALUES, tak jak robi to MySQL. Więc zamiast

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

potrzebujesz dwóch oddzielnych instrukcji INSERT

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy poprawny kod SQL da zły wynik?

  2. Określ domyślny schemat puli JDBC w weblogic/oracle

  3. Mapowanie typu niestandardowego Oracle UDT dla nie zostało określone lub jest nieprawidłowe

  4. Oracle SQL, aby zmienić typ kolumny z numeru na varchar2, gdy zawiera dane

  5. Dlaczego PHP OCI8/Oracle oci_bind_array_by_name nie działa dla mnie?