source

자동 번호 생성을 위한 Oracle 트리거

factcode 2023. 8. 22. 22:31
반응형

자동 번호 생성을 위한 Oracle 트리거

저는 오라클에서 트리거를 만들어 본 적이 없어서 방향을 찾고 있습니다.

ID가 insert 문에 없을 경우 ID를 하나씩 증가시키는 트리거를 만들고 싶습니다.

ID는 10000에서 시작해야 하며 레코드를 삽입할 때 다음 ID는 10001이어야 합니다.삽입 문에 ID가 포함된 경우 자동 증분을 재정의해야 합니다.

ie

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

다음과 같아야 합니다.

이름 성 ID

마이클 조던 10000

래리 버드 10001

insert into t1 (firstname, lastname, id) values ('Scottie','Pippen',50000)

다음과 같아야 합니다.

이름 성 ID

마이클 조던 10000

래리 버드 10001

스코티 피펜 50000

이와 같은 것이 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;

이전 버전의 경우 시퀀스에서 다음 값을 가져오려면 SELECT INTO를 수행해야 합니다.

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;

Oracle 시퀀스에는 공백이 없습니다.따라서 다양한 이유로 특정 값을 생략할 수 있습니다.몇 분, 몇 시간 또는 며칠 후에 완료된 경우 첫 번째 삽입의 ID는 10000이고 두 번째 삽입의 ID는 10020입니다.

또한 Oracle은 MySQL처럼 VALUE 절에 여러 행을 지정하는 것을 지원하지 않습니다.그래서 보다는

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

두 개의 별도 INSERT 문이 필요합니다.

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

sql 블록이 아닌 트리거 자체의 조건으로 이 트리거를 코딩하는 것이 좋습니다.

CREATE OR REPLACE TRIGGER your_trigger
BEFORE INSERT ON your_table
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN (new.id IS NULL)
  BEGIN
    SELECT your_sequence.nextval
    INTO :new.id
    FROM dual;
  END;
/

이 솔루션에서는 조건이 일치하는 경우에만 트리거가 실행됩니다(ID가 null임).

그렇지 않으면 항상 트리거가 실행되고 블록이 ID가 null인지 확인합니다.DB는 null이 아닌 값에 대해 아무것도 하지 않는 SQL 블록을 실행해야 합니다.

언급URL : https://stackoverflow.com/questions/8330305/oracle-trigger-to-create-an-autonumber

반응형