[SQL] 테이블의 정보를 update 후 history테이블에 update 정보 insert하기 (이전정보도 함께 insert)

Jeonniii·2023년 3월 18일
0

A테이블의 정보를 update 후

A테이블의 정보를 update 한 뒤, history테이블에 update정보를 insert 해야했다.

여기서 문제는 update 전 정보와 후 정보를 함께 insert해야했다.

여러가지 상황들로 인하여 trigger사용이 힘들었기 때문에 sql문 1개로 update와 insert 하는 법을 궁리해보았다.

<A 테이블>

문서번호문서상태문서내용
1작성완료abcd
2작성중1234
3작성중가나다라
4삭제99999

<B 테이블>

문서번호유저번호블로그고유번호카테고리번호
11001VEL00001001
21002VEL00002001
31001VEL00001003
31001VEL00001001

<History 테이블>

History시퀀스문서번호변경 전 문서상태변경 후 문서상태비고
11작성중작성완료

문서상태가 변경될 때마다 History테이블에 변경정보가 insert 되어야한다.

유저정보 1001의 '작성중'상태의 문서를 모두 '삭제'로 변경하는 쿼리이다.

WITH prev AS (
			SELECT
				A.문서번호
				, A.문서상태
			  FROM A
			 INNER JOIN B
			    ON A.문서번호 =B.문서번호
			 WHERE A.문서상태 ='작성중'
	), cur AS (
		UPDATE A
		   SET 문서상태 = '삭제'
		 WHERE 문서번호 IN (SELECT 문서번호 FROM prev)
	 RETURNING 문서번호 , 문서상태
	) INSERT INTO = History (
		문서번호
		, 변경 전 문서상태
		, 변겅 후 문서상태
        , 비고)
		SELECT
			cur.문서번호
			, prev.문서상태
			, cur.문서상태
			, '유저 직접 변경'
		  FROM cur, prev
		 WHERE cur.문서번호 = prev.문서번호;

무분별한 with문 사용을 최대한 줄이는 노력을 하고 있는데 동일한 정보를 가지고 update와 insert를 한번에 하려고 하니 with문을 사용할 수 밖에 없었다.
추후 더 좋은 쿼리가 생각나면 수정하는 방향으로 가야겠다.

profile
주니어 개발자 #웹개발#fullStack#java#react

0개의 댓글