티스토리 뷰
발생일: 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;