Sequence 생성 관련해서 문의드려요~ 0 9 4,933

by 바가지 [Oracle 기초] Sequence Seq [2025.01.14 14:24:41]


안녕하세요.

제가 운영하는 시스템에서 기존 NVL(MAX(SEQ), 0) + 1 생성하던 Sequence 에 무결성 오류 이슈가 생겨

Sequence 객체를 따로 생성하여 NEXTVAL 로 증가시킬려고 했는데 문제가 생겨서 문의 드립니다~

기존에 Insert 하던 테이블의 PK가 CITY, SEQ 2개로 

CITY SEQ
seoul 1
seoul 2
seoul 3
Busan 1
Busan 2
Incheon 1
Incheon 2
INSERT INTO TABLE1 (CITY, SEQ) VALUES ( ?, (SELECT NVL(MAX(SEQ), 0) +1 FROM TABLE1 WHERE CITY = ? )) 

이런 방법으로 증가 시켰던걸 

INSERT INTO TABLE1 (CITY, SEQ) VALUES ( ?, SEQ.NEXTVAL)

로 변경할려고 했는데 생각해보니 위 방법으로는 저렇게 데이터가 생성되지 않을거 같아서요..

혹시 CITY 컬럼 데이터 별 그룹 순번으로 SEQ를 생성할 수 있는 방법이 있을까요?

고수님들의 조언 부탁드려요~~

by ㅇㅇ준 [2025.01.14 16:46:07]

시퀀스 하나만 생성해서는 그렇게 이용하지 못합니다.

 SEQ 컬럼의 값은 시퀀스로 입력하고 조회시에 seq로 정렬해서 각 도시별 순번을 구하는 방법은 어떠신가요


by 바가지 [2025.01.15 11:18:16]

답변 감사드립니다!

그런데 고객이 저장되는 데이터를 저런식으로 저장되길 원하고 있어서...

혹시 현재년월일 + seq 형식으로 PK를 새로 하나 추가해서 nextval로 증가 시키면 어떨까 하는데 괜찮은 방법일까요?


by 우리집아찌 [2025.01.15 11:32:42]

중간에 삭제되면 정렬을 위해서 해당 도시를

순서대로 업데이트 할일이 생긴다면 어떻게 하실건가요?


by 우리집아찌 [2025.01.15 09:48:23]

위분과 동일합니다.

인조키(seq)는 시퀀스 사용하시고 도시순번은 SQL에서 seq 번호로 정렬하세요


by 바가지 [2025.01.15 14:08:13]

말씀하신 부분은 생각 못했네요..감사합니다!


by 우주민 [2025.01.15 10:31:18]

city, seq 두개 항목이 pk 설정이 되었는데 max(sql) + 1 로직으로 무결성 오류가 생길 수 있을까 하는 생각이 먼저 드네요.

로직적으로는 저 방법으로도 정상적인 데이터 생성이 될꺼 같아서요.


by 바가지 [2025.01.15 14:10:40]

트랜잭션이 발생하는곳도 한곳인데 간헐적으로 무결성 오류가 발생한 로그가 남아있습니다..ㅠㅠ

 


by ㅇㅇ준 [2025.01.20 12:12:08]

select max(seq_value) + 1 from table1;
식으로 조회한 값을 변수에 담고 뒤에 로직이 더 있거나, 많은 트랜잭션이 동일한 기능을 수행하게된다면 seq_value의 값이 동일하게 채번되어 pk 중복오류가 발생하게됩니다.


by jkson [2025.01.16 08:24:43]

굳이 그렇게 하시려고 한다면 시퀀스용으로 도시별 max 값을 가지고 있는 테이블을 하나 생성하시고 select for update 문으로 해당 테이블에 접근하여 max값을 리턴하는 펑션을 만드셔서 무결성을 유지하는 방법이 있습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입