27.9 Ограничения на представления
Максимальное количество таблиц, которые могут быть указаны в определении представления, равно 61.
Обработка представлений не оптимизирована:
Невозможно создать индекс на представлении.
Индексы могут использоваться для представлений, обрабатываемых алгоритмом слияния. Однако представление, обрабатываемое алгоритмом временных таблиц, не может воспользоваться индексами на своих базовых таблицах (хотя индексы могут быть использованы во время создания временных таблиц).
Существует общее правило, что нельзя изменять таблицу и выбирать из той же таблицы в подзапросе. См. раздел 15.2.15.12 «Ограничения на подзапросы».
То же правило применяется, если вы выбираете из представления, которое выбирает из таблицы, если представление выбирает из таблицы в подзапросе и представление оценивается с использованием алгоритма слияния. Пример:
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;
Если представление оценивается с использованием временной таблицы, вы можете выбрать из таблицы в подзапросе представления и всё ещё изменять эту таблицу во внешнем запросе. В этом случае представление хранится во временной таблице, и поэтому вы фактически не выбираете из таблицы в подзапросе и не изменяете её одновременно. (Это ещё одна причина, по которой вы можете захотеть заставить MySQL использовать алгоритм временных таблиц, указав ALGORITHM = TEMPTABLE в определении представления.)
Вы можете использовать DROP TABLE или ALTER TABLE, чтобы удалить или изменить таблицу, используемую в определении представления. При выполнении операций DROP или ALTER не выдаётся предупреждение, даже если это делает представление недействительным. Вместо этого ошибка возникает позже, когда представление используется. CHECK
TABLE можно использовать для проверки представлений, которые были объявлены недействительными операциями DROP или ALTER.
Что касается обновляемости представлений, то общей целью для представлений является то, что, если какое-либо представление теоретически обновляемо, оно должно быть обновляемо на практике. Многие теоретически обновляемые представления могут быть обновлены сейчас, но ограничения всё ещё существуют. Подробности см. в разделе 27.5.3 «Обновляемые и вставляемые представления».
В текущей реализации представлений существует недостаток. Если пользователю предоставлены базовые привилегии для создания представления (привилегии CREATE VIEW и SELECT), этот пользователь не может вызвать SHOW CREATE VIEW для этого объекта, если ему также не предоставлена привилегия SHOW VIEW.
Этот недостаток может привести к проблемам при создании резервной копии базы данных с помощью mysqldump, которая может завершиться неудачей из-за недостаточных привилегий. Эта проблема описана в ошибке #22062.
Решение проблемы заключается в том, чтобы администратор вручную предоставил привилегию SHOW VIEW пользователям, которым предоставлена привилегия CREATE VIEW, так как MySQL не предоставляет её неявно при создании представлений.
Представления не имеют индексов, поэтому подсказки индексов не применяются. Использование подсказок индексов при выборе из представления запрещено.
SHOW CREATE VIEW отображает определения представлений с использованием клаузы AS
для каждого столбца. Если столбец создан из выражения, по умолчанию используется псевдоним, который представляет текст выражения, который может быть довольно длинным. Псевдонимы имён столбцов в операторах alias_nameCREATE VIEW проверяются по отношению к максимальной длине столбца в 64 символа (а не максимальной длине псевдонима в 256 символов). В результате представления, созданные из вывода SHOW
CREATE VIEW, завершаются неудачей, если какой-либо псевдоним столбца превышает 64 символа. Это может вызвать проблемы в следующих обстоятельствах для представлений с слишком длинными псевдонимами:
Определения представлений не дублируются на более новые реплики, которые применяют ограничение на длину столбца.
Файлы дампов, созданные с помощью mysqldump, не могут быть загружены на серверы, которые применяют ограничение на длину столбца.
Решение проблемы в обоих случаях заключается в изменении каждого проблемного определения представления, чтобы использовать псевдонимы, которые обеспечивают более короткие имена столбцов. После этого представление реплицируется должным образом, и его можно выполнить дамп и заново загрузить без ошибок. Для изменения определения нужно удалить и снова создать представление с помощью DROP
VIEW и CREATE VIEW или заменить определение на CREATE OR REPLACE
VIEW.
Для проблем, возникающих при повторной загрузке определений представлений в файлах дампов, другим решением является изменение файла дампов для изменения операторов CREATE VIEW в нём. Однако это не изменяет исходные определения представлений, что может вызвать проблемы при последующих операциях дампинга.
© 2025 Oracle
Licensed under the GPLv2 License.