27.5 View 제약
뷰의 처리는 최적화되어 있지 않습니다.
뷰에 인덱스를 만들 수 없습니다.
병합 알고리즘을 사용하여 처리 된 뷰에 인덱스를 사용하는 것은 가능합니다. 그러나 TEMPTABLE 알고리즘으로 처리 된 뷰는 그 기반이되는 테이블의 인덱스를 사용할 수 없습니다 (그러나 임시 테이블을 만드는 동안 인덱스를 사용할 수 있습니다).
뷰의 FROM
절에서 서브 쿼리는 사용할 수 없습니다.
일반적인 원칙은 테이블을 변경할 수도 하위 쿼리 같은 테이블에서 선택 할 수 없습니다. 섹션 27.4 "서브 쿼리 제한" 을 참조하십시오.
테이블에서 선택하는 뷰를 선택하면 뷰가 서브 쿼리의 테이블에서 선택되거나 뷰가 병합 알고리즘을 사용하여 평가하는 경우에도 동일한 원칙이 적용됩니다. 예 :
CREATE VIEW v1 AS SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a); UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
임시 테이블을 사용하여 뷰가 평가되는 경우, 뷰 서브 쿼리의 테이블에서 선택하고, 외부 쿼리에서 테이블을 변경할 수 있습니다. 이 경우 뷰는 임시 테이블에 저장되기 때문에 실제로는 뷰를 서브 쿼리의 테이블에서 선택하고 "동시에"변경하는 것이 아닙니다. (이것은 뷰 정의에서 ALGORITHM = TEMPTABLE
을 지정하여 MySQL에서 TEMPTABLE 알고리즘을 강제로 사용하는 하나의 이유입니다.)
DROP TABLE
또는 ALTER TABLE
을 사용하면 뷰 정의에서 사용되는 테이블을 삭제 또는 변경할 수 있습니다. 뷰를 비활성화하는 경우에도 DROP
또는 ALTER
조작에 의해 경고가 나오는 것은 아닙니다. 대신 나중에 뷰를 사용할 때 오류가 발생합니다. CHECK TABLE
은 DROP
또는 ALTER
조작으로 비활성화 된 뷰의 체크에 사용할 수 있습니다.
MySQL 5.6.5 이전에는 뷰 정의는 특정 문에서 "고정"됩니다. PREPARE
에서 준비된 문이 뷰를 참조하는 경우 나중에 문이 수행 될 때마다 확인되는 뷰 정의는 준비된 시점의 뷰 정의됩니다. 이것은 문이 준비된 후 실행되기 전에 뷰 정의가 변경 되더라도 같은 것입니다. 다음의 예에서 EXECUTE
문에서 반환 된 결과는 현재의 날짜와 시간이 아니라 임의의 수치입니다.
CREATE VIEW v AS SELECT RAND (); PREPARE s FROM 'SELECT * FROM v'; ALTER VIEW v AS SELECT NOW (); EXECUTE s;
뷰의 갱신 가능성에 관해서는 어떤 뷰에서도 이론적으로 업데이트 가능하면 실제로 업데이트 할 필요가 있다는 것이 뷰의 전반적인 목적입니다. 여기에는 정의에 UNION
이 적혀있는 뷰도 포함되어 있습니다. 현재, 이론적으로 갱신 가능한 모든보기가 실제로 업데이트 가능한 것은 아닙니다. 첫 번째 뷰 구현은 사용 가능한 업데이트 가능한 뷰를 가능한 한 신속하게 MySQL을 제공하기 위해 의도적으로 이렇게 적혀있었습니다. 현재 이론적으로 갱신 가능한 뷰의 많은 업데이트 할 수 있지만 제한은 여전히 존재합니다.
WHERE
절 이외의 장소에 서브 쿼리가있는 갱신 가능한 뷰.SELECT
목록에 서브 쿼리가있는 뷰에 업데이트 가능한 경우가 있습니다.UPDATE
를 사용하여 결합으로 정의 된 뷰의 여러 기반이되는 테이블은 업데이트 할 수 없습니다.DELETE
를 사용하여 결합으로 정의 된 뷰는 업데이트 할 수 없습니다.
뷰의 현재 구현에는 단점이 있습니다. 뷰 생성에 필요한 기본 권한 ( CREATE VIEW
권한과 SELECT
권한)이 부여되어 있어도 SHOW VIEW
권한도 부여되지 않은 경우 개체 SHOW CREATE VIEW
를 호출 할 수 없습니다.
권한의 부족으로 인해 mysqldump가 실패 할 가능성이 있다는 단점하여이 명령을 사용하여 데이터베이스 백업에 문제가 발생할 수 있습니다. 이 문제에 대해서는 Bug # 22062로 설명하고 있습니다.
문제의 해결 방법은 뷰가 작성된 경우 MySQL이 암묵적으로 SHOW VIEW
권한을 미치지 않으므로 CREATE VIEW
를 인정하는 사용자에게 관리자가 수동으로 권한을 부여합니다.
뷰에 인덱스가 없기 때문에 인덱스 팁은 적용되지 않습니다. 뷰에서 선택시 인덱스 힌트의 사용은 허용되지 않습니다.
SHOW CREATE VIEW
는 컬럼마다 AS
절을 사용하여 뷰 정의를 표시합니다. 수식에서 컬럼을 만들 때 기본 별칭은 식 텍스트가 상당히 길어질 수 있습니다. alias_name
CREATE VIEW
문에서 컬럼 이름에 대한 별칭 (256 문자의 최대의 별칭 길이가 아니라) 64 문자의 최대 컬럼 길이에 대해 검사됩니다. 그 결과 하나의 컬럼 별칭이 64자를 초과하면 SHOW CREATE VIEW
출력에서 생성 된 뷰는 실패합니다. 따라서 너무 별칭을 가진 뷰에 대해 다음 환경에서 문제가 발생할 수 있습니다.
뷰 정의는 컬럼 길이의 제약을 강제하는 새로운 슬레이브에 복제 할 수 없습니다.
mysqldump로 생성 된 덤프 파일은 컬럼 길이의 제약을 강제하는 서버에로드 할 수 없습니다.
이 문제를 해결하려면 짧은 컬럼 이름을 제공하는 별칭을 사용하도록 문제가있는 각 뷰 정의를 변경합니다. 이 경우 뷰는 제대로 복제 오류를 생성하지 덤프 및 리로드 수 있습니다. 정의를 변경하려면 DROP VIEW
및 CREATE VIEW
뷰를 삭제하고 다시 만들거나 CREATE OR REPLACE VIEW
를 사용하여 정의를 대체합니다.
덤프 파일보기 정의 리로드시 문제가 발생하는 경우 CREATE VIEW
문을 변경하도록 덤프 파일을 편집하면이 문제를 해결할 수 있습니다. 그러나 이것은 원래 뷰 정의를 변경하지 않기 때문에 다음 덤프 동작의 문제를 일으킬 수 있습니다.