H.4. Restricciones en vistas

MySQL 5.0

H.4. Restricciones en vistas

El procesamiento de vistas no es optimizado:

  • No es posible crear un ínidice en una vista.

  • Los indices pueden ser usados para procesar vistas usando un algoritmo de combinación. Sin embargo, una vista que es procesada con el algoritmo de tablas temporales no es capaz de tomar ventaja de los indices en sus tablas contenidas ( aunque los indices pueden ser usados durante la generación de las tablas temporales).

Las subconsultas no pueden ser usados en la cláusula de una vista. Esta limitación sera removida en el futuro.

Existe un principio genera que no se puede modificar una tabla y una seleccion de la misma tabla en una subconsulta. Ver Sección H.3, “Restricciones en subconsultas”.

El mismo principio aplica también si usted hace una seleccion en una vista que hace una seleccion en una tabla, si la seleccion de la vista en una tabla dentro de una subconsulta la vista es evaluada usando el algoritmo de combinación(merge). Ejemplo:

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;

Si la vista es evaluada usando una tabla temporal, se puede seleccionar una tabla en una subconsulta de una vista y se puede seguir modificando la tabla que esta afuera de la consulta. En este caso la vista sera materializada y aunque no se está realmente seleccionando de una tabla en una subconsulta y modificandola “a el mismo tiempo.” (Esta es otra razón que tal vez desearia forzar a MySQL para usar el algorigo de tablas temporales especificando las palabras en la definición de la vista.)

Sepuede usar o para eliminar o modificar una tabla que es usada en la definición de una vista (la cual valida una vista) y ninguna alerta resulta de la operación de elimiar o modificar. Un error ocure más tarde cuando la vista es usada.

Una definición de una vista es “congelada” en ciertas sentencias:

  • Si una sentencia preparado por refiere a una vista, el contenido de la vista es visto cada vez que la sentencia es ejecutada mas tarde sera el contenido de la vista a tiempo que fue preparada. Esto se cumple aun si la definición de la vista es cambiada después de que se preparó la sentencia y antes que ésta es ejecutada. Ejemplo:

    CREATE VIEW v AS SELECT 1;
    PREPARE s FROM 'SELECT * FROM v';
    ALTER VIEW v AS SELECT 2;
    EXECUTE s;
    

    El resultado regresado por la sentencia es 1, y no 2.

  • Si una sentencia en una rutina almacenada refiere una vista, el contenido de la vista visto por la stentencia es su contenido de la primera ejecución de la sentencia. Por ejemplo, esto significa que si una sentencia es ejecutada en un ciclo, en futuras iteraciones de la setnencia se vera el mismo contenido de la vista, aun y si la definición de la vista cambia mas tarde en el ciclo. Ejemplo:

    CREATE VIEW v AS SELECT 1;
    delimiter //
    CREATE PROCEDURE p ()
    BEGIN
      DECLARE i INT DEFAULT 0;
      WHILE i < 5 DO
        SELECT * FROM v;
        SET i = i + 1;
        ALTER VIEW v AS SELECT 2;
      END WHILE;
    END;
    //
    delimiter ;
    CALL p();
    

    Cuando el procedimiento p() es llamado, el SELECT regresa 1 cada vez dentro de el ciclo, aunque la definicion de la vista cambie dentro de el ciclo.

Con respecto a las actualizaciones en vistas, la meta sobre todas para las vistas es que si cualquier vista que teoricamente se puede actualizar, esta deberia ser una práctica de actualización. Esto incluye vistas que tienen un en su definición. Actualmente, no todas las vistas que teoricamente se pueden actualizar pueden ser actualizadas. La implementación inicial de vistas fue deliberablemente escrita en esta manera en orden de obtener trabajando las vistas actualizables en MySQL tan rapido como sea posible. Muchas actualizaciones teoricas en vistas pueden ser actualizadas por ahora, pero algunas limitaciones siguen existiendo:

  • Las viastas actualiazbles con subconsultas en cualquier otro lugar que no sea en la clausula . Algunas vistas que tienen subconsultas en la lista pueden ser actualizadas.

  • No puede usar un para actualizar más de una tabla incluida en una vista que sea definida como un join.

  • No se puede usar una sentencia para actualizar una vista que está definida como un JOIN.