티스토리 뷰

발생일: 2019.04.22

 

키워드: mysql, view, 뷰

 

문제:

 

기존 변수를 모두 변경하면서 관련된 테이블의 이름도 함께 변경하려고 한다.

테이블 앨리어스가 있다면 가장 쉽게 운영 중인 서비스에도 문제 없이 적용할 수 있을 것 같다.

가만, view 가 업데이트도 가능했던가?

 

 

해결책:

 

단일 테이블로 생성한 뷰는 업데이트나 인서트도 가능하다.

 

    - view 조건에 해당되지 않는 경우에도 업데이트나 인서트가 가능하다.

        CREATE VIEW emp_view AS

        SELECT * FROM emp WHERE age > 10

 

        INSERT INTO emp_view (iage) VALUES (5);

 

    - 뷰 생성 시 컬럼 앨리어스를 사용한 경우에도 인서트나 업데이트 된다.

        CREATE VIEW emp_view AS

        SELECT id, age AS age2 FROM emp

 

    - 1:1 매핑이 되지 않는 경우엔 업데이트 가능하지 않다.

        CREATE VIEW emp_view AS

        SELECT id, age, age AS age2 FROM emp

 

        CREATE VIEW emp_view AS

        SELECT id, age, 10 AS age2 FROM emp

 

참고로,

- 뷰의 정의는 생성 시점에 정해진다. 뷰가 생성된 이후에 테이블의 컬럼이 추가된 경우, 뷰에 적용되진 않는다.

- 뷰를 생성한 후에 테이블을 삭제해도, 뷰는 삭제되지 않는다. 참조만 없음

 

 

논의:

 

# 운영 중인 foo 테이블의 이름을 bar 로 변경

 

스킴을 변경해도 운영 중인 테이블이나 변경 타이밍이 다른 코드 등에서 동일하게 사용할 수 있어야 하니,

기존 테이블의 이름을 변경하고 바로 기존 이름의 뷰를 생성해두는 게 안전하다.

(rename 하는 동안, 테이블을 찾지 못해 오류가 발생할 수 있음)

 

RENAME TABLE foo TO bar;

CREATE VIEW foo AS SELECT * FROM bar;

 

 

# 변경할 테이블의 컬럼명을 바꾸려고 하는 경우

 

foo_id 컬럼이 있는 foo_sub 테이블을,

bar_id 컬럼을 갖는 bar_sub 테이블로 변경하려는 경우임.

 

RENAME TABLE foo_sub TO bar_sub;

ALTER TABLE bar_sub CHANGE foo_id bar_id INT(10) unsigned;

CREATE VIEW foo AS

    SELECT id, bar_id AS foo_id, ...

    FROM bar;

반응형
댓글
공지사항