자동 번호 생성을 위한 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
'source' 카테고리의 다른 글
회사 프록시 .pac 뒤에서 npm 사용 (0) | 2023.08.22 |
---|---|
Alamofire를 사용하여 매개 변수가 있는 파일 업로드 (0) | 2023.08.22 |
Oracle에서 로깅/노로깅 옵션의 목적은 무엇입니까? (0) | 2023.08.17 |
MariaDB와 C# 사이의 날짜 시간 형식 문제 (0) | 2023.08.17 |
CSS에서 div 배경색을 투명하게 만드는 방법 (0) | 2023.08.17 |