Spec-Zone .ru
спецификации, руководства, описания, API
|
View processing is not optimized:
It is not possible to create an index on a view.
Indexes can be used for views processed using the merge algorithm. However, a view that is processed with the temptable algorithm is unable to take advantage of indexes on its underlying tables (although indexes can be used during generation of the temporary tables).
Subqueries cannot be used in the FROM
clause of a view.
There is a general principle that you cannot modify a table and select from the same table in a subquery. See Section E.4, "Restrictions on Subqueries".
The same principle also applies if you select from a view that selects from the table, if the view selects from the table in a subquery and the view is evaluated using the merge algorithm. Example:
CREATE VIEW v1 ASSELECT * 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;
If the view is evaluated using a temporary table, you can select from the
table in the view subquery and still modify that table in the outer query. In this case the view will be stored
in a temporary table and thus you are not really selecting from the table in a subquery and modifying it "at the same time." (This is another reason you might
wish to force MySQL to use the temptable algorithm by specifying ALGORITHM =
TEMPTABLE
in the view definition.)
You can use DROP TABLE
or ALTER
TABLE
to drop or alter a table that is used in a view definition. No warning results from the DROP
or ALTER
operation, even though this invalidates
the view. Instead, an error occurs later, when the view is used. CHECK TABLE
can be used to check for views that have been invalidated by
DROP
or ALTER
operations.
A view definition is "frozen" by certain statements:
If a statement prepared by PREPARE
refers to a view, the view definition seen each time the statement is executed later will be the
definition of the view at the time it was prepared. This is true even if the view definition is changed
after the statement is prepared and before it is executed. Example:
CREATE VIEW v AS SELECT RAND();PREPARE s FROM 'SELECT * FROM v';ALTER VIEW v AS SELECT NOW();EXECUTE s;
The result returned by the EXECUTE
statement is a random number, not the current date and time.
With regard to view updatability, the overall goal for views is that if any view is theoretically updatable, it
should be updatable in practice. This includes views that have UNION
in their definition. Currently, not all views that are theoretically
updatable can be updated. The initial view implementation was deliberately written this way to get usable,
updatable views into MySQL as quickly as possible. Many theoretically updatable views can be updated now, but
limitations still exist:
Updatable views with subqueries anywhere other than in the WHERE
clause. Some views that have subqueries in the SELECT
list may be updatable.
You cannot use UPDATE
to update more than one underlying table of a view that is defined
as a join.
You cannot use DELETE
to update a view that is defined as a join.
There exists a shortcoming with the current implementation of views. If a user is granted the basic privileges
necessary to create a view (the CREATE
VIEW
and SELECT
privileges), that user will be unable to call SHOW CREATE VIEW
on that object unless the user is also granted the SHOW VIEW
privilege.
That shortcoming can lead to problems backing up a database with mysqldump, which may fail due to insufficient privileges. This problem is described in Bug #22062.
The workaround to the problem is for the administrator to manually grant the SHOW VIEW
privilege to users who are granted CREATE VIEW
, since MySQL doesn't grant it implicitly when views are created.
Views do not have indexes, so index hints do not apply. Use of index hints when selecting from a view is not permitted.
SHOW CREATE VIEW
displays view definitions using an AS
clause for each column. If a column is created from
an expression, the default alias is the expression text, which can be quite long. Aliases for column names in alias_name
CREATE VIEW
statements are checked against the maximum column length of 64
characters (not the maximum alias length of 256 characters). As a result, views created from the output of SHOW CREATE VIEW
fail if any column alias exceeds 64 characters. This can
cause problems in the following circumstances for views with too-long aliases:
View definitions fail to replicate to newer slaves that enforce the column-length restriction.
Dump files created with mysqldump cannot be loaded into servers that enforce the column-length restriction.
A workaround for either problem is the modify each problematic view definition to use aliases that provide
shorter column names. Then the view will replicate properly, and can be dumped and reloaded without causing an
error. To modify the definition, drop and create the view again with DROP VIEW
and CREATE
VIEW
, or replace the definition with CREATE OR REPLACE VIEW
.
For problems that occur when reloading view definitions in dump files, another workaround is to edit the dump
file to modify its CREATE VIEW
statements. However, this does not change the original view
definitions, which may cause problems for subsequent dump operations.