Как сделать представление в mysql

SQL — Использование представлений

Дата публикации: 2017-12-11

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

От автора: представление — это не что иное, как оператор SQL, который хранится в базе данных с соответствующим именем. На самом деле представление является определенным структурированным набором данных таблицы в виде предопределенного SQL-запроса.

Представления SQL могут содержать все строки таблицы или определенные выбранные строки. Представление может быть создано из одной или нескольких таблиц, это зависит от составленного для представления SQL-запроса.

Представления, которые являются типом виртуальных таблиц, позволяют пользователям делать следующее:

Структурировать данные таким образом, который будет наиболее естественным или интуитивным для пользователей или классов пользователей.

Ограничивать доступ к данным таким образом, чтобы пользователь мог находить и изменять (в некоторых случаях) только те данные, которые ему нужны, и не более того.

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Обобщать данные из разных таблиц, чтобы использовать их для различных отчетов.

Создание представлений

Представления базы данных создаются с помощью инструкции CREATE VIEW. Представления можно создать из одной таблицы, нескольких таблиц или другого представления.

Пользователь должен иметь соответствующие системные привилегии в зависимости от конкретной реализации.
Основной синтаксис CREATE VIEW следующий:

Источник

Представления (VIEW) в MySQL

Эта статья является обзором представлений, появившихся в MySQL версии 5.0. В ней рассмотрены вопросы создания, преимущества и ограничения представлений.

Что такое представление?

Представление (VIEW) — объект базы данных, являющийся результатом выполнения запроса к базы данных, определенного с помощью оператора SELECT, в момент обращения к представлению.

Представления иногда называют «виртуальными таблицами». Такое название связано с тем, что представление доступно для пользователя как таблица, но само оно не содержит данных, а извлекает их из таблиц в момент обращения к нему. Если данные изменены в базовой таблице, то пользователь получит актуальные данные при обращении к представлению, использующему данную таблицу; кэширования результатов выборки из таблицы при работе представлений не производится. При этом, механизм кэширования запросов (query cache) работает на уровне запросов пользователя безотносительно к тому, обращается ли пользователь к таблицам или представлениям.

Представления могут основываться как на таблицах, так и на других представлениях, т.е. могут быть вложенными (до 32 уровней вложенности).

Преимущества использования представлений:

Ограничения представлений в MySQL

В статье приведены ограничения для версии MySQL 5.1 (в дальнейшем их число может сократиться).

Создание представлений

Оператор CREATE VIEW содержит 4 необязательные конструкции:

По умолчанию колонки представления имеют те же имена, что и поля возращаемые оператором SELECT в определении представления. При явном указании имен полей представления column_list должен включать по одному имени для каждого поля разделенных запятой. Существует две причины по которым желательно использовать явное указание имен полей представления:

Для просмотра содержимого представления мы используем оператор SELECT (полностью аналогично как в случае простой таблицы), с другой строны, оператор SELECT есть в самом определении представления, т.е. получается вложенная конструкция — запрос в запросе. При этом, некоторые конструкции оператора SELECT могут присутствовать в обоих операторах. Возможны три варианта развития событий: они обе будут выполнены, одна из них будет проигнорированна и результат неопределен. Рассмотрим подробнее эти случаи:

Алгоритмы представлений

При создании представления есть возможность явно указать используемый алгоритм с помощью необязательной конструкции [ ALGORITHM = < UNDEFINED | MERGE | TEMPTABLE >]
UNDEFINED означает, что MySQL сам выбирает какой алгоритм использовать при обращении к представлению. Это значение по умолчанию, если данная конструкция отсутствует.

Использование алгоритма MERGE требует соответствия 1 к 1 между строками таблицы и основанного на ней представления.

Пусть наше представление выбирает отношение числа просмотров к числу ответов для тем форума:

Пусть наше представление выбирает количество тем для каждого форума:

Найдем максимальное количество тем в форуме:

Подводя итог, следует отметить, что нет серьезных причин явно указывать алгоритм при создании представления, так как:

Обновляемость представлений

Представление называется обновляемым, если к нему могут быть применимы операторы UPDATE и DELETE для изменения данных в таблицах, на которых основано представление. Для того, чтобы представление было обновляемым должно быть выполнено 2 условия:

Обновляемое представление может допускать добавление данных ( INSERT ), если все поля таблицы-источника, не присутствующие в представлении, имеют значения по умолчанию.

Обратите внимание: для представлений, основанных на нескольких таблицах, операция добавления данных ( INSERT ) работает только в случае если происходит добавление в единственную реальную таблицу. Удаление данных ( DELETE ) для таких представлений не поддерживается.

При использовании в определении представления конструкции WITH [ CASCADED | LOCAL ] CHECK OPTION все добавляемые или изменяемые строки будут проверяться на соответствие определению представления.

Иными словами, нельзя добавить или изменить данные в представлении таким образом, чтобы они не были доступны через представление.

Ключевые слова CASCADED и LOCAL определяют глубину проверки для представлений основанных на других представлениях:

Рассмотрим пример обновляемого представления, основанного на двух таблицах. Пусть наше представление выбирает темы форума с числом просмотров более 2000.

punbb >CREATE OR REPLACE VIEW v AS
-> SELECT forum_name, `subject`, num_views FROM topics,forums f
-> WHERE forum_id=f.id AND num_views> 2000 WITH CHECK OPTION ;
Query OK, 0 rows affected ( 0.03 sec )

punbb >UPDATE v SET num_views= 2003 WHERE subject= ‘test’ ;
Query OK, 0 rows affected ( 0.03 sec )
Rows matched: 1 Changed: 0 Warnings : 0

Однако, если мы попробуем установить значение num_views меньше 2000, то новое значение не будет удовлетворять условию WHERE num_views> 2000 в определении представления и обновления не произойдет.

Не все обновляемые представления позволяют добавление данных:

Причина в том, что значением по умолчанию колонки forum_id является 0, поэтому добавляемая строка не удовлетворяет условию WHERE forum_id=f.id в определении представления. Указать же явно значение forum_id мы не можем, так как такого поля нет в определении представления:

Таким образом, наше представление, основанное на двух таблицах, позволяет обновлять обе таблицы и добавлять данные только в одну из них.

Источник

Что такое представления VIEWS в базах данных? И зачем они нужны?

Многие начинающие администраторы и программисты баз данных, да и просто системные администраторы, которые обслуживают некую базу данных, не знают что такое представление или VIEWS, и зачем вообще они нужны. Сейчас мы попробуем разобраться, что же это такое.

Начнем с небольшой теории.

Что такое VIEWS?

VIEWS – представление, или, например, в PostgreSQL они называются «Видами» (т.е. Вид), русские админы часто называют их вьюхами, т.е. одно представление это вьюшка. Она представляет собой хранимый запрос к базе данных, также ее можно назвать виртуальная таблица, но в этой таблице данные не хранятся, а хранится только сам запрос. Но, тем не менее, к вьюшке можно обращаться как к обычной таблице и извлекать данные из нее.

Мы с Вами говорим о базах данных, в которых используется язык SQL, исходя из этого, можно сделать вывод, что VIEWS можно создать на данном языке. Это очень распространенный объект в базе данных, поэтому во всех СУБД есть возможность создавать представления в графическом интерфейсе путем нажатия кнопки «Создать представление» или «Создать новый вид», а также, конечно же, с использованием инструкции «CREATE VIEW».

Но перед тем как учиться создавать вьюшки, давайте поговорим о том, зачем они нужны и какие преимущества они нам дадут.

Зачем нужны представления?

Одним из главных достоинством представлений является то, что они сильно упрощают взаимодействие с данными в базе данных. Допустим, Вам необходимо каждый раз делать сложную по своей структуре выборку, а как Вы знаете, запрос на выборку может быть, ну просто очень сложный и этому нет предела. И если не было бы вьюшек, то Вам приходилось бы каждый раз запускать этот запрос, или даже его модифицировать, например, для вставки условий. А так как у нас есть такие объекты как представления, нам этого делать не придется. Мы просто на всего создадим одну вьюшку, и потом уже к ней будем обращаться с помощью уже простых запросов, которые также можно делать сложными, если это необходимо. Например, вьюшки также можно объединять с другими таблицами или другими представлениями.

К представлениям можно обращаться и из приложений, например, Вам нужно вывести какой-нибудь отчет, формирование которого требует каких-то расчетов, это легко можно реализовать путем написания необходимого запроса (в котором и будут рассчитываться данные, например из разных таблиц) и вставке этого запроса во вьюшку. А потом уже обращаться к этой вьюшке, например с помощью такого простого запроса как:

Как создать представление VIEWS?

Теперь давайте поговорим о том, как создавать эти самые вьюшки. Во-первых, сразу скажу, что для этого необходимы знания SQL (для построения сложных запросов). Во-вторых, Вы за ранее должны определиться, что Вам необходимо вывести в результате того или иного запроса. Рассматривать процесс создания представления путем нажатия кнопок мы не будем, так это достаточно просто. Мы рассмотрим создание VIEWS с использованием языка SQL (хотя и это тоже просто).

Например, в PostgreSQL запрос создания представления будет выглядеть так:

Здесь мы использовали простой запрос на выборку, Вы в свою очередь можете писать любой запрос, даже с объединением нескольких таблиц и условий к ним.

Полный синтаксис команды CREATE VIEW (в PostgreSQL) выглядит следующим образом:

После того, как Вы создали представление, Вы можете к нему обращаться. А данные, которые будет выводить вьюшка, будут изменяться в зависимости от изменений данных в исходных таблицах, так как данные во вьюшке формируются при обращении к этому представлению. Исходя из этого, можно сделать вывод, что данные, которые выводит вьюшка, будут всегда актуальные.

У меня все, надеюсь, теперь у Вас есть представление о том, что такое VIEWS, пока!

Источник

MySQL Views

Просмотры

Содержание:

Почему просмотров?

Для просмотра MySQL требуется версия 5.0 или выше

Чтобы заставить работать представления, вам нужно обновить MySQL до версии 5.0 (или выше). Вы можете проверить свою версию MySQL следующим образом:

Проверьте привилегии текущего пользователя:

Оператору CREATE VIEW требуется привилегия CREATE VIEW для представления и некоторая привилегия для каждого столбца, выбранного оператором SELECT. Следующая команда показывает права пользователя.

Выберите базу данных:

Перед созданием представления мы должны выбрать базу данных. Следующая команда показывает список баз данных.

Теперь выберите базу данных «hr» и перечислите таблицы:

Создать вид

Следующие утверждения создают представление. По умолчанию представление связано с базой данных по умолчанию (в настоящее время используется база данных). Чтобы связать представление с заданной базой данных, укажите имя как имя_базы_данных . view_name при его создании. Вот полный синтаксис:

Синтаксис:

Объяснение:

Оператор CREATE VIEW создает новый вид.

select_statement: select_statement является оператором SELECT и предоставляет определение представления. select_statement может выбирать данные из базовых таблиц или других представлений.

Пример:

column_list: часть column_list является необязательной. Он предоставляет список имен для столбцов представления сразу после имени представления, где имена должны быть уникальными. Количество имен в column_list должно быть таким же, как количество столбцов, извлеченных оператором SELECT. Если вы хотите присвоить столбцам вида другое имя, вы можете сделать это, добавив предложение [AS name] в список выбора.

Пример: просмотр без column_list

Теперь укажите имя столбца в представлении выше:

ALGORITHM: предложение ALGORITHM является необязательным, оно влияет на то, как MySQL обрабатывает представление. ALGORITHM принимает три значения: MERGE, TEMPTABLE или UNDEFINED. Алгоритм по умолчанию НЕ УКАЗАН.

[DEFINER = <пользователь | ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ >]
[БЕЗОПАСНОСТЬ SQL ]: предложения
DEFINER и SQL SECURITY задают контекст безопасности, который будет использоваться при проверке прав доступа во время вызова представления.

Если вы укажете предложение DEFINER, следующие правила определяют допустимые пользовательские значения DEFINER:

В хранимой подпрограмме, определенной с помощью характеристики SQL SECURITY DEFINER, CURRENT_USER возвращает значение подпрограммы DEFINER. Это также влияет на представление, определенное в такой подпрограмме, если определение представления содержит значение DEFINER CURRENT_USER.

[С [КАСКАДИРОВАННЫМ | LOCAL] CHECK OPTION]: предложение WITH CHECK OPTION может быть задано для обновляемого представления, чтобы предотвратить вставки или обновления строк, кроме тех, для которых предложение WHERE в select_statement имеет значение true. В предложении WITH CHECK OPTION для обновляемого представления ключевые слова LOCAL и CASCADED определяют область проверочного тестирования, когда представление определяется в терминах другого представления. Ключевое слово LOCAL ограничивает опцию CHECK только определенным представлением. CASCADED заставляет также проверять проверки для базовых представлений. Когда не указано ни одно ключевое слово, по умолчанию используется CASCADED.

Ограничения на определение View

Инструменты для создания MySQL Views

Вы можете написать процедуру в инструменте командной строки MySQL или использовать MySQL Workbench, который является отличным интерфейсным инструментом (здесь мы использовали версию 5.3 CE).

Инструмент командной строки MySQL:

Выберите команду MySQL Client из меню «Пуск»:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

При выборе командной строки MySQL появится следующий экран:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

После успешного входа в систему вы можете получить доступ к командной строке MySQL:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

Теперь вы можете создать и запустить собственное представление, см. Следующий пример:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

MySQL верстак (5.3 CE):

Выберите MySQL верстак из меню Пуск:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

После выбора MySQL верстак появится следующий экран входа в систему:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

Теперь введите данные для входа:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

После успешного входа в систему появится новый экран и из панели браузера объектов выберите базу данных:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

После выбора базы данных щелкните правой кнопкой мыши на Views, появится новое всплывающее окно:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

После выбора «Создать вид» появится следующий экран, где вы можете написать свой собственный вид.

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

После написания представления нажмите кнопку «Применить», и появится следующий экран:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

Следующим экраном будет просмотр сценария и его применение в базе данных.

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

Теперь нажмите кнопку Готово и запустите просмотр:

Как сделать представление в mysql. Смотреть фото Как сделать представление в mysql. Смотреть картинку Как сделать представление в mysql. Картинка про Как сделать представление в mysql. Фото Как сделать представление в mysql

Изменить вид

Оператор ALTER VIEW изменяет определение существующего представления. Синтаксис оператора похож на CREATE VIEW.

Синтаксис:

Для этого оператора требуются привилегии CREATE VIEW и DROP для представления, а также некоторые привилегии для каждого столбца, указанного в операторе SELECT.

Оставить представление

Оператор DROP VIEW используется для удаления одного или нескольких представлений. Чтобы удалить представление, вы должны иметь привилегию DROP для каждого представления. Вот синтаксис:

Синтаксис:

Предложение IF EXISTS предотвращает возникновение ошибки для несуществующих представлений.

MySQL CREATE VIEW с ГДЕ

Команда CREATE VIEW может использоваться с предложением WHERE.

Пример:

Пример таблицы: автор

Приведенный выше оператор MySQL создаст представление ‘view_author’, в котором будут приниматься записи (для всех столбцов) таблицы авторов, если эти записи содержат значение ‘USA’ для столбца страны.

MySQL CREATE VIEW с помощью AND и OR

Команда CREATE VIEW может использоваться с операторами AND и OR.

Пример:

Пример таблицы: издатель

MySQL CREATE VIEW с GROUP BY

Команда CREATE VIEW может использоваться с предложением GROUP BY.

Пример:

Пример таблицы: book_mast

Приведенный выше оператор создаст представление ‘view_bookmast’, в котором будут собраны все записи, сгруппированные по pub_lang, из pub_lang и количество книг для каждого языка (pub_lang).

MySQL CREATE VIEW с ORDER BY

Команда CREATE VIEW может использоваться с предложением ORDER BY.

Пример:

Пример таблицы: book_mast

Приведенный выше оператор MySQL создаст представление ‘view_bookmast’, в котором будут собраны все записи, сгруппированные по pub_lang и отсортированные по pub_lang, из pub_lang и количество книг для каждого языка (pub_lang) таблицы book_mast.

MySQL CREATE VIEW с МЕЖДУ и IN

Команда CREATE VIEW может использоваться с оператором BETWEEN и IN.

Пример:

Пример таблицы: book_mast

MySQL CREATE VIEW с LIKE

Команда CREATE VIEW может использоваться с оператором LIKE.

Пример:

Пример таблицы: автор

Приведенный выше оператор MySQL создаст представление ‘view_author’, в котором будут приниматься все записи таблицы автора, если (A) имя автора (aut_name) не начинается с ‘T’ и (B) имя автора (aut_name) не начинается с буквой W

MySQL CREATE VIEW с использованием подзапросов

Команда CREATE VIEW может использоваться с подзапросами.

Пример:

Пример таблицы: покупка

Пример таблицы: book_mast

Приведенный выше оператор MySQL создаст представление ‘view_purchase’, в котором будут храниться все записи столбцов invoice_no, book_name и cate_id таблицы покупок, если идентификатор категории (cate_id) удовлетворяет условию, определенному в подзапросе (за которым следует cate_id =).

Подзапрос извлекает только cate_ids из таблицы book_mast, которая содержит книги с 201 страницей.

MySQL CREATE VIEW с помощью JOIN

Команда CREATE VIEW может использоваться вместе с оператором JOIN.

Пример:

Пример таблицы: категория

Пример таблицы: покупка

Приведенный выше оператор MySQL создаст представление view_purchase вместе с оператором JOIN.

Здесь оператор JOIN извлекает cate_id, cate_descrip из таблицы категорий и invoice_no, invoice_dt и book_name из таблицы покупок, если cate_id таблицы категорий и покупки совпадают.

MySQL CREATE VIEW с помощью UNION

Команда CREATE VIEW может использоваться с UNION.

Пример:

Пример таблицы: book_mast

Вышеупомянутая инструкция MySQL создаст представление ‘view_bookmast’, содержащее столбцы, как в ‘book_mast’.

Записи будут вставлены с объединением трех подзапросов.

Первый запрос вставляет эти строки в представление «view_bookmast» из таблицы «book_mast», чей pub_id равен «P001».

Второй запрос вставляет эти строки в представление «view_bookmast» из таблицы «book_mast», строки которой имеют столбец «book_name», начинающийся с любой буквы от «A» до «G».

Третий запрос вставляет эти строки в представление view_bookmast из таблицы book_mast, строки которой имеют любое из следующих значений 165 250 350 400 500 в no_page.

Предыдущая: Транзакция MySQL
Далее: MySQL Security

Источник

Представления (VIEW) в MySQL (исходники)

В комментариях Хабра упоминались вопросы по использованию представлений. Данный топик является обзором представлений, появившихся в MySQL версии 5.0. В нем рассмотрены вопросы создания, преимущества и ограничения представлений.

Что такое представление?

Представления иногда называют «виртуальными таблицами». Такое название связано с тем, что представление доступно для пользователя как таблица, но само оно не содержит данных, а извлекает их из таблиц в момент обращения к нему. Если данные изменены в базовой таблице, то пользователь получит актуальные данные при обращении к представлению, использующему данную таблицу; кэширования результатов выборки из таблицы при работе представлений не производится. При этом, механизм кэширования запросов (query cache) работает на уровне запросов пользователя безотносительно к тому, обращается ли пользователь к таблицам или представлениям.

Представления могут основываться как на таблицах, так и на других представлениях, т.е. могут быть вложенными (до 32 уровней вложенности).

Преимущества использования представлений:


Ограничения представлений в MySQL


Создание представлений

Для создания представления используется оператор CREATE VIEW, имеющий следующий синтаксис:

CREATE [OR REPLACE]
[ALGORITHM = ]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED / LOCAL] CHECK OPTION]

CREATE VIEW v AS SELECT a.id, b.id FROM a,b;

CREATE VIEW v (a_id, b_id) AS SELECT a.id, b.id FROM a,b;

CREATE VIEW v AS SELECT a.id a_id, b.id b_id FROM a,b;

CREATE VIEW v AS SELECT group_concat(DISTINCT column_name oreder BY column_name separator `+`) FROM table_name;

Алгоритмы представлений

Существует два алгоритма, используемых MySQL при обращении к представлению: MERGE и TEMPTABLE.

В случае алгоритма MERGE, MySQL при обращении к представлению добавляет в использующийся оператор соответствующие части из определения представления и выполняет получившийся оператор.

В случае алгоритма TEMPTABLE, MySQL заносит содержимое представления во временную таблицу, над которой затем выполняется оператор обращенный к представлению.
Обратите внимание : в случае использования этого алгоритма представление не может быть обновляемым (см. далее).

При создании представления есть возможность явно указать используемый алгоритм с помощью необязательной конструкции [ALGORITHM = ]
UNDEFINED означает, что MySQL сам выбирает какой алгоритм использовать при обращении к представлению. Это значение по умолчанию, если данная конструкция отсутствует.

Использование алгоритма MERGE требует соответствия 1 к 1 между строками таблицы и основанного на ней представления.

Пусть наше представление выбирает отношение числа просмотров к числу ответов для тем форума:

CREATE VIEW v AS SELECT subject, num_views/num_replies AS param FROM topics WHERE num_replies>0;

Для данного представления каждая строка соответствует единственной строке из таблицы topics, т.е. может быть использован алгоритм MERGE. Рассмотрим следующее обращение к нашему представлению:

SELECT subject, param FROM v WHERE param>1000;

В случае MERGE алгоритма MySQL включает определение представления в использующийся оператор SELECT: заменяет имя представления на имя таблицы, заменяет список полей на определения полей представления и добавляет условие в части WHERE с помощью оператора AND. Итоговый оператор, выполняемый затем MySQL, выглядит следующим образом:

SELECT subject, num_views/num_replies AS param FROM topics WHERE num_replies>0 AND num_views/num_replies>1000;

Если в определении представления используются групповые функции (count, max, avg, group_concat и т.д.), подзапросы в части перечисления полей или конструкции DISTINCT, GROUP BY, то не выполняется требуемое алгоритмом MERGE соответствие 1 к 1 между строками таблицы и основанного на ней представления.

Пусть наше представление выбирает количество тем для каждого форума:

CREATE VIEW v AS SELECT forum_id, count(*) AS num FROM topics GROUP BY forum_id;

Найдем максимальное количество тем в форуме:

Если бы использовался алгоритм MERGE, то этот запрос был бы преобразован следующим образом:

SELECT MAX(count(*)) FROM topics GROUP BY forum_id;

Выполнение этого запроса приводит к ошибке «ERROR 1111 (HY000): Invalid USE of GROUP function», так как используется вложенность групповых функций.

В этом случае MySQL использует алгоритм TEMPTABLE, т.е. заносит содержимое представления во временную таблицу (данный процесс иногда называют «материализацией представления»), а затем вычисляет MAX() используя данные временной таблицы:

CREATE TEMPORARY TABLE tmp_table SELECT forum_id, count(*) AS num FROM topics GROUP BY forum_id;
SELECT MAX(num) FROM tmp_table;
DROP TABLE tpm_table;

Обновляемость представлений

Обратите внимание : встречающиеся в русско-язычной литературе требования, чтобы обновляемое представление было основано на единственной таблице и присутствие в числе полей представления первичного ключа физичекой таблицы не являются необходимыми. Скорее всего требование единственной таблицы является ошибкой перевода. Дело в том, что через представление, основанное на нескольких таблицах, может обновлять только одну таблицу за запрос, т.е. конструкция SET оператора UPDATE должна перечислять колонки только одной таблицы из определения представления. Кроме того, чтобы представление, основанное на нескольких таблицах, было обновляемым, таблицы в его определении должны быть объединены только с помощью INNER JOIN, а не OUTER JOIN или UNION.

Обновляемое представление может допускать добавление данных (INSERT), если все поля таблицы-источника, не присутствующие в представлении, имеют значения по умолчанию.

Обратите внимание : для представлений, основанных на нескольких таблицах, операция добавления данных (INSERT) работает только в случае если происходит добавление в единственную реальную таблицу. Удаление данных (DELETE) для таких представлений не поддерживается.

Иными словами, нельзя добавить или изменить данные в представлении таким образом, чтобы они не были доступны через представление.

Рассмотрим пример обновляемого представления, основанного на двух таблицах. Пусть наше представление выбирает темы форума с числом просмотров более 2000.

punbb >CREATE OR REPLACE VIEW v AS
-> SELECT forum_name, `subject`, num_views FROM topics,forums f
-> WHERE forum_id=f.id AND num_views>2000 WITH CHECK OPTION;
Query OK, 0 rows affected (0.03 sec)

punbb >UPDATE v SET num_views=2003 WHERE subject=`test`;
Query OK, 0 rows affected (0.03 sec)
Rows matched: 1 Changed: 0 WARNINGS: 0

punbb >SELECT subject, num_views FROM topics WHERE subject=`test`;
+———+————+
/ subject / num_views /
+———+————+
/ test / 2003 /
+———+————+
1 rows IN SET (0.01 sec)

Однако, если мы попробуем установить значение num_views меньше 2000, то новое значение не будет удовлетворять условию WHERE num_views>2000 в определении представления и обновления не произойдет.

punbb >UPDATE v SET num_views=1999 WHERE subject=`test`;
ERROR 1369 (HY000): CHECK OPTION failed `punbb.v`

Не все обновляемые представления позволяют добавление данных:

punbb >INSERT INTO v (subject,num_views) VALUES(`test1`,4000);
ERROR 1369 (HY000): CHECK OPTION failed `punbb.v`

Причина в том, что значением по умолчанию колонки forum_id является 0, поэтому добавляемая строка не удовлетворяет условию WHERE forum_id=f.id в определении представления. Указать же явно значение forum_id мы не можем, так как такого поля нет в определении представления:

punbb >INSERT INTO v (forum_id,subject,num_views) VALUES(1,`test1`,4000);
ERROR 1054 (42S22): Unknown COLUMN `forum_id` IN `field list`

punbb >INSERT INTO v (forum_name) VALUES(`TEST`);
Query OK, 1 row affected (0.00 sec)

Таким образом, наше представление, основанное на двух таблицах, позволяет обновлять обе таблицы и добавлять данные только в одну из них.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *