티스토리 뷰

한달동안 소비한 금액을 계산하기 위해 매일 내가 쳐먹은 메뉴와 가격을 입력하는 payment 라는 테이블이 있다고 하자. 나는 어제(20180712) 점심으로 와퍼를 먹었고, 저녁으로 빅맥을 먹고 저녁의 디저트로 라테를 마셨다.

식사를 할 때마다 아래와 같이 테이블에 하나하나 입력해 두었다.


INSERT INTO payment VALUES('whopper', 6000, '20180712')
INSERT INTO payment VALUES('bicmac', 6000, '20180712')
INSERT INTO payment VALUES('latte', 2000, '20180712')


menu 

price 

pay_date 

whopper 

6000 

20180712 

bicmac 

6000 

20180712 

latte 

2000 

20180712 


그리하여 payment 테이블은 위와 같은 상태가 되었다.

오늘(20180713)도 같은 메뉴를 같은 가격으로 먹었는데, 입력하는 것을 까먹었다.


menu 

price 

pay_date 

whopper 

6000 

20180712 

bicmac

6000 

20180712 

latte 

2000 

20180712 


아직까지 이런 상태로 있는 payment 테이블을 아래의 상태로 변경하고 싶다.


menu 

price 

pay_date 

whopper 

6000 

20180712 

bicmac 

6000 

20180712 

latte 

2000 

20180712 

whopper 

6000 

20180713 

bicmac

6000 

20180713 

latte 

2000 

20180713 


제일 쉽게 생각할 수 있는 방법은 어제 했던 것과 같이 하나하나 먹은 메뉴를 insert query로 넣으면 된다.

만약, 어제 50개의 메뉴를 먹었고 오늘도 똑같은 메뉴를 50개 먹었다고 해보자. 고작 pay_date 하나만 다르게 해서 넣는건데 50개의 메뉴에 대한 정보를 insert query로 넣는 것은 스마트하지 않다. 불가능하지는 않지만 입력하는데 시간이 좀 걸릴 뿐이고 입력한 값이 틀리는 실수가 발생하기 쉽다.


스마트한 방법은 어제 넣었던 값을 그대로 복사해서 pay_date 값만 바꿔서 넣는 것이다.

INSERT INTO payment SELECT (menu, price, '20180713') FROM payment WHERE pay_date = '20180712'

칼럼명을 하나하나 다 치기 힘든 사람은 information_schema를 이용해 payment 테이블의 칼럼명을 얻어서 넣으면 된다.


지금 같은 경우는 칼럼의 수가 3개밖에 되지 않기 때문에 별로 문제가 발생하지 않지만, 만약에 칼럼 수가 많다고 생각해 보자. 칼럼의 순서가 뒤바뀐다던지 하면 query 에서 에러가 발생할 수 있고, 다른 사람이 이 query를 봤을 때, 수동으로 변경되는 칼럼이 어떤 칼럼인지 스키마를 보고 위에서부터 숫자를 세 나가지 않으면 알기 어렵다. 따라서 information_schema에서 칼럼명을 얻어와 위와 같이 특정 몇 값만 손으로 수정하는 것은 가장 단순하며 위험한 방법이다. 아래와 같이 스마트 하게 처리하자.


CREATE TEMPORARY TABLE tmp_payment AS SELECT * FROM payment WHERE pay_date = '20180712';

UPDATE tmp_payment set pay_date = '20180713';
INSERT INTO payment SELECT * FROM tmp_tmp_payment;


1. 어제 입력했던 데이터를 복사해 현재 테이블과 동일한 스키마의 임시테이블에 넣는다.

2. 임시테이블의 내가 변경하고 싶은 칼럼만을 변경해준다.
3. 임시테이블의 값을 통째로 insert 한다.

이 방법으로 하면 칼럼이 아무리 많아도 누락 혹은 개수가 맞지 않거나 순서가 뒤바뀌는 일은 일어나지 않고, 내가 변경하고 싶은 칼럼만 간단히 변경할 수 있다. 그리고 무엇보다 누가봐도 직관적으로 이해하기 쉽다.

temporary table의 lifetime은 내가 DB에서 로그아웃 하는 순간 자동으로 drop 된다.

댓글
댓글쓰기 폼