Spec-Zone .ru
спецификации, руководства, описания, API
|
Некоторые представления обновляемы. Таким образом, можно использовать их в операторах такой как UPDATE
, DELETE
,
или INSERT
обновить содержание базовой таблицы. Для представления, чтобы быть
обновляемым, должно быть непосредственное отношение между строками в представлении и строками в базовой таблице.
Есть также определенные другие конструкции, которые делают представление необновляемым. Чтобы быть более
определенным, представление не обновляемо, если оно содержит какое-либо следующее:
DISTINCT
GROUP BY
HAVING
Подзапрос в списке выборки
Определенные соединения (см. дополнительное обсуждение соединения позже в этом разделе),
Необновляемое представление в FROM
пункт
Подзапрос в WHERE
пункт, который относится к таблице в
FROM
пункт
Обращается только к литеральным значениям (в этом случае, нет никакой базовой таблицы, чтобы обновить),
Использование ALGORITHM = TEMPTABLE
(использование
временной таблицы всегда делает представление необновляемым),
Многократные ссылки на любой столбец базовой таблицы.
Относительно insertability (являющийся обновляемым с INSERT
операторы), обновляемое представление является insertable, если это также удовлетворяет эти дополнительные
требования для столбцов представления:
Не должно быть никаких двойных имен столбцов представления.
Представление должно содержать все столбцы в базовой таблице, у которых нет значения по умолчанию.
Столбцы представления должны быть простыми ссылками столбца и не полученными столбцами. Полученный столбец является тем, который не является простой ссылкой столбца, но получается из выражения. Они - примеры полученных столбцов:
3.14159col1 + 3UPPER(col2)col3 / col4(subquery
)
Представление, у которого есть соединение простых ссылок столбца и полученных столбцов, не является insertable, но это может быть обновляемо, если Вы обновляете только те столбцы, которые не получаются. Рассмотрите это представление:
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
Это представление не является insertable потому что col2
получается из выражения.
Но это обновляемо, если обновление не пытается обновить col2
. Это обновление
допустимо:
UPDATE v SET col1 = 0;
Это обновление не допустимо, потому что оно пытается обновить полученный столбец:
UPDATE v SET col2 = 0;
Для многократного табличного представления иногда возможно быть обновляемым, предполагая, что это может быть
обработано с MERGE
алгоритм. Для этого, чтобы работать, представление должно
использовать внутреннее объединение (не внешнее объединение или a UNION
). Кроме того, только единственная таблица в определении представления
может быть обновлена, таким образом, SET
пункт должен назвать только столбцы от
одной из таблиц в представлении. Представления то использование UNION ALL
не разрешаются даже при том, что они могли бы быть теоретически
обновляемыми, потому что реализация использует временные таблицы, чтобы обработать их.
Для многократно-табличного обновляемого представления, INSERT
может работать, если это вставляет в единственную таблицу. DELETE
не поддерживается.
Если таблица содержит AUTO_INCREMENT
столбец, вставляя в insertable просматривает
на таблице, которая не включает AUTO_INCREMENT
столбец не изменяет значение LAST_INSERT_ID()
,
потому что побочные эффекты вставки значений по умолчанию в столбцы не часть представления не должны быть
видимыми.
WITH CHECK OPTION
пункт может быть дан для обновляемого представления, чтобы
предотвратить, вставляет или обновляет к строкам кроме тех для который WHERE
пункт
в select_statement
истина.
В a WITH CHECK OPTION
пункт для обновляемого представления, LOCAL
и CASCADED
ключевые слова определяют контекст тестирования проверки, когда
представление определяется с точки зрения другого представления. LOCAL
ключевое
слово ограничивает CHECK OPTION
только к определяемому представлению. CASCADED
заставляет проверки на базовые представления быть оцененными также.
Когда никакое ключевое слово не дается, значение по умолчанию CASCADED
. Рассмотрите
определения для следующей таблицы и набора представлений:
mysql>CREATE TABLE t1 (a INT);
mysql>CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
->WITH CHECK OPTION;
mysql>CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
->WITH LOCAL CHECK OPTION;
mysql>CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
->WITH CASCADED CHECK OPTION;
Здесь v2
и v3
представления определяются с точки
зрения другого представления, v1
. v2
имеет a LOCAL
проверьте опцию, таким образом, вставки тестируются только против v2
проверить. v3
имеет a CASCADED
проверьте опцию, таким образом, вставки тестируются не только против ее собственной проверки, но и против
таковых из базовых представлений. Следующие операторы иллюстрируют эти различия:
mysql>INSERT INTO v2 VALUES (2);
Query OK, 1 row affected (0.00 sec)mysql>INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'
MySQL устанавливает флаг, названный представлением updatability флаг, в CREATE VIEW
время. Флаг устанавливается в YES
(истина), если UPDATE
и DELETE
(и подобные операции), являются законными для представления. Иначе, флаг устанавливается в NO
(ложь). IS_UPDATABLE
столбец в INFORMATION_SCHEMA.VIEWS
таблица выводит на экран состояние этого флага. Это
означает, что сервер всегда знает, обновляемо ли представление. Если представление не обновляемо, операторы
такой UPDATE
, DELETE
,
и INSERT
недопустимы и будет отклонен. (Отметьте, что, даже если представление
обновляемо, не могло бы быть возможно вставить в это, как описано в другом месте в этом разделе.)
На updatability представлений может влиять значение updatable_views_with_limit
системная переменная. См. Раздел
5.1.4, "Системные Переменные Сервера".