sql / select문을 insert 하기

flobeeee·2022년 2월 18일
0

Today I Learned

목록 보기
20/35

새로운 sql 문법을 알게 되어서 정리하려 한다.


의미

테이블 내에 있는 데이터를 다른 테이블에 넣을 수 있다.
(ctrl + c, ctrl + v 와 비슷하다. 같은 테이블에도 넣을 수 있다.)

실습

- 에러

테스트를 위해 book 테이블을 만들어서 2개의 데이터를 넣어봤다.

INSERT INTO book
SELECT *
FROM book;

이렇게 하면 pk에러가 난다
id가 primary key인데 중복이 되면 안된다.
그런데 전체를 선택해서 넣으려니 똑같이 id가 1, 2 로 들어가서 실행할 수 없다.


- 복붙하기

INSERT INTO book (created_at, updated_at, deleted_at, status, name)
SELECT created_at, updated_at, deleted_at, status, name
FROM book;

id 제외한 데이터를 복붙했다.
created_at, updated_at 가 동일한 게 찝찝하다.


- created_at, updated_at

INSERT INTO book (created_at, updated_at, deleted_at, status, name)
SELECT NOW(), NOW(), deleted_at, status, name
FROM book;

기존에 있던 데이터가 모두 복사됐다.

NOW()를 넣어서 현재시간을 표기하려 했는데, mysql 서버시간과 현재시간이 안맞아서 마음에 안든다.


- 정확한 현재시간

INSERT INTO book (created_at, updated_at, deleted_at, status, name)
SELECT DATE_ADD(NOW(), INTERVAL 9 HOUR), DATE_ADD(NOW(), INTERVAL 9 HOUR), deleted_at, status, name
FROM book where id in (1,2);

DATE_ADD(NOW(), INTERVAL 9 HOUR) 로 9시간을 더해서 시간을 맞춰주고,
where id in (1,2) 로 처음 두개의 데이터만 복사하게 했다.


- status 를 inactive 로 들어가게 하기

INSERT INTO book (created_at, updated_at, deleted_at, status, name)
SELECT DATE_ADD(NOW(), INTERVAL 9 HOUR), DATE_ADD(NOW(), INTERVAL 9 HOUR), deleted_at, 'inactive', name
FROM book where id in (1,2);

profile
기록하는 백엔드 개발자

0개의 댓글