2011-11-30 3 views
11

오라클에서 트리거를 생성 한 적이 없으므로 어느 방향을 찾고 있습니다.자 동 번호를 생성하는 오라클 트리거

ID가 삽입 문에없는 경우 ID를 1 씩 증가시키는 트리거를 만들고 싶습니다.

ID는 10000에서 시작해야하며 레코드가 삽입 될 때 다음 ID는 10001이어야합니다. 삽입 문에 ID가 있으면 자동 증가를 무시해야합니다.

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

처럼 보일 것입니다 즉 :

FIRSTNAME의 LASTNAME 아이디

Micahel 요르단 10000

래리 버드 10001

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

가 보일 것 같은 :

FIRSTNAME의 LASTNAME 아이디

Micahel 요르단 10000

래리 버드 10001

스코티 피펜 50000

답변

24

이런 식으로 뭔가가

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; 
을는 11g에서 작동합니다

이전 버전을 사용중인 경우 시퀀스에서 다음 값을 얻으려면 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; 

오라클 시퀀스에는 간격이 없습니다. 따라서 다양한 이유로 특정 값을 건너 뛸 수 있습니다. 몇 분, 몇 시간 또는 며칠 후에 첫 번째 삽입물의 ID는 10000이고 두 번째 ID는 10020의 ID를 가질 수 있습니다.

또한 Oracle은 MySQL과 마찬가지로 VALUES 절에 여러 행을 지정하는 것을 지원하지 않습니다. 그래서 오히려

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

이상 내가 아니라 SQL 블록에서, 트리거 자체에 조건이 트리거를 코딩하는 것이 좋습니다 두 개의 INSERT 문

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

[https://github.com/miklagard/oracle-table-creator](https://github.com/miklagard/oracle-table-creator) – cem

2

필요 했어.

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 블록을 실행해야합니다.

관련 문제