5 정답
-- 1. 트랜잭션 시작
START TRANSACTION;
-- 2. box_office_copy2 테이블 복제
CREATE TABLE box_office_copy2 AS
SELECT *
FROM box_office_copy;
-- 3. box_office_copy2 테이블 데이터 전체 삭제
DELETE FROM box_office_copy2;
-- 4. 2017년 1~10위 데이터 선택해 INSERT
INSERT INTO box_office_copy2
SELECT years, ranks, movie_name, release_date, sale_amt, audience_num, 0
FROM box_office
WHERE YEAR(release_date) = 2017
AND ranks BETWEEN 1 AND 10;
-- 5. 모든 작업 취소
ROLLBACK;
해설 마지막에 모든 작업을 취소해야 하므로 트랜잭션 처리를 수동으로 해야 합니다. 먼저 START TRANSACTION 문을 실행합니다. 그다음 CREATE TABLE AS 구문으로 box_office_copy 테이블을 복제해 box_office_copy2 테이블을 생성합니다. 세 번째, DELETE 문으로 전체 데이터를 지웁니다. 네 번째, SELECT 문이 결합된 INSERT 문으로 2017년 개봉 영화 중 1~10위 영화를 box_office 테이블에서 읽어 와서 box_office_copy 테이블에 입력합니다. 여기서 last_year_audi_num 칼럼은 box_office 테이블에 없으므로 SELECT 절에 0을 명시합니다. 마지막으로 ROLLBACK 문을 사용하면 모든 작업이 취소됩니다.
그럼 이 시점에 box_office_copy2 테이블에는 어떤 데이터가 있을까요? 모두 취소했으므로 데이터가 하나도 남아 있지 않을까요? 아닙니다. box_office_copy2 테이블에는 box_office_copy 테이블과 동일한 데이터가 남아 있습니다. ROLLBACK 문으로 모든 트랜잭션을 취소해 DELETE, INSERT 문의 작업을 취소했지만, CREATE TABLE AS 구문으로 box_office_copy 테이블을 복제한 데이터는 남아 있습니다. 왜냐하면 이 문장은 DDL이며, 트랜잭션은 DML 문에만 적용됩니다.