종료일시가 복합키로 구성된 테이블 데이터 수정시 로직 0 2 1,634

by 용천 [Oracle 기초] 오라클 복합키 종료일시 선분이력 [2023.03.08 15:29:48]


업체테이블라고 했을때 

테이블 컬럼으로 업체ID, 유효종료일시, 유효시작일시 등의 컬럼이 있고

업체ID와 유효종료일시가 복합키? 형태로 구성되어 있습니다.

 

질문1. 

이런식의 구성은 history 테이블을 별도로 두지 않고 수정/삭제 이력을 관리하기 위함일까요?

(삭제 로직에서도 실제 쿼리는 DELETE가 아닌 유효종료일시를 UPDATE하는 식으로 )

 

질문2. 해당 테이블의 특정 컬럼이 하나라도 수정되었을 경우 UPDATE 쿼리를 통해 유효종료일시를 현재일자로 바꿔주고 INSERT INTO SELECT 를 통해 신규 데이터를 INSERT 하면 될까요?

(혹은 그반대 순서)(쿼리자체는 이상한부분이 없을까요?)

 

UPDATE 업체테이블
   SET 유효종료일시 = SYSDATE
     , 업체명 = 'AA'
 WHERE 업체ID = '12345'
   AND TO_CHAR(업체종료일시, 'YYYYMMDD') = '99991231'
;
INSERT INTO 업체테이블 (업체ID, 유효종료일시, 유효시작일시, 업체명)
(SELECT 업체ID, TO_DATE('99991231235959', 'yyyymmddhh24miss'), SYSDATE, '수정된업체명'
   FORM 업체테이블 
 WHERE 업체ID = '12345'
   AND TO_CHAR(유효종료일시, 'YYYYMMDD') = '99991231' )

 

질문3. 위 질문에 대한 쿼리를 쓰다보니... UPDATE를 먼저하면 INSERT INTO SELECT에서 조회되는게 없지 않나 생각이 들어서 INSERT INTO SELECT 쿼리를 쓰면 안되고

자바단 트랜잭션이 묶인 메소드내에서 SELECT후 해당 데이터를 가지고 있다가 아래와 같이 호출해야 하는걸까요?

 

1. 업체정보 SELEECT 후 데이터 가지고 있기

2. 업체정보 UPDATE(유효종료일시를 SYSDATE로)

3. 업체정보 INSERT(1번에서 조회했던 업체정보에 수정된부분과 유효종료일시 99991231, 유효시작일시 SYSDATE로)

 

부분이라도 답변 주시면 감사하겠습니다!

by jkson [2023.03.08 16:26:23]

1. 단순히 히스토리 테이블처럼 변경 이력을 관리하기 위한 것일 수도 있습니다만 그보다는 과거 기준을 로직에서 활용해야하는 경우가 많을 때 저렇게 구현하는 게 효과적일 것 같네요.

(예를들어 상품의 가격이 3월 이전과 이후에 달라졌을 때 3월 이전에 구매한 상품에 대한 단가 정보를 로직에 활용할 필요성이 있다든지 하는 경우)

단순히 로직에서는 현재 데이터만 필요하고 변경 이력을 관리할 용도로만 설계한다면 히스토리 테이블을 별도로 두는 것이 효율적이겠죠.

2. 말씀하신 것처럼 UPDATE된 이후에는 유효종료일시가 99991231인 데이터가 존재하지 않을 것이므로 INSERT가 불가하겠습니다.

3번과 같이 SELECT에서 해당 ROWID 정보를 읽어와 해당 데이터 1건을 활용해 신규데이터를 INSERT하는 방식으로 사용하시면 되겠습니다.

 


by 용천 [2023.03.09 18:21:20]

답변감사합니다!

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