MySQL 5 Nuevas Funcionalidades (Views) 1 de 3

Ok ya fue mucho de decir y decir que MySQL 5 es una maravilla pero como jijos lo pruebo bueno aqui les dejo un tutorial de mi parte, espero les sea util

Views (Vistas)

El uso de las vistas es muy común en la mayoría de los motores de bases de datos actuales, su función es resumir consultas complejas en una sola y mandarla llamar como si se tratara de una tabla, con la ventaja de que no se tiene que declarar toda la consulta.

Abra una sesión de línea de comandos y ejecute los siguientes ejercicios

Mysql> CREATE DATABASE pruebas;

Mysql> USE pruebas;

Mysql> CREATE TABLE `pruebas`.`contacto` (

Mysql> `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

Mysql> `nombre` VARCHAR(45) NOT NULL DEFAULT »,

Mysql> `correo` VARCHAR(250) NOT NULL DEFAULT »,

Mysql> `id_depto` INTEGER UNSIGNED NOT NULL DEFAULT 0,

Mysql> PRIMARY KEY(`id`)

Mysql> )

Mysql> ENGINE = InnoDB;

Mysql> CREATE TABLE `pruebas`.`depto` (

Mysql> `id_depto` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

Mysql> `depto` VARCHAR(45) NOT NULL DEFAULT »,

Mysql> PRIMARY KEY(`id_depto`)

Mysql> )

Mysql> ENGINE = InnoDB;

Mysql>INSERT INTO depto (depto) VALUES (‘Contabilidad’);

Mysql>INSERT INTO depto (depto) VALUES (‘Finanzas’);

Mysql>INSERT INTO depto (depto) VALUES (‘Administracion’);

Mysql>INSERT INTO depto (depto) VALUES (‘Gerencia’);

Mysql>INSERT INTO depto (depto) VALUES (‘Mercadotecnia’);

Mysql>INSERT INTO contacto (nombre,correo,id_depto) VALUES (‘Pepe’,’pepe@pepe.com’,1);

Mysql>INSERT INTO contacto (nombre,correo,id_depto) VALUES (‘Juan’,’juan@juan.com’,5);

MySQL> ALTER TABLE `pruebas`.`contacto` ADD CONSTRAINT `FK_contacto_1` FOREIGN KEY `FK_contacto_1` (`id_depto`)

REFERENCES `depto` (`id_depto`)

ON UPDATE CASCADE;

Hasta este punto se ha creado una base de datos llamada prueba la cual utilizaremos en este documento y dos tablas, contacto y depto, la cual iremos poblando con datos de ejemplo para hacer los ejemplos, al final creamos una llave foránea para unir las dos tablas usando el campo de id_depto y le decimos que cuando se actualice una se realice en cascada.

Veamos para realizar una consulta donde se necesite obtener los datos de la tabla de contacto y que contenga el nombre del departamento se necesitaría realizar una consulta SELECT como esta

mysql>SELECT nombre,correo,depto FROM contacto,depto WHERE contacto.id_depto=depto.id_depto;

Donde lo que hacemos es decirle a la base de datos que nos regrese el nombre,correo y departamento donde las dos tablas coincidan con el id_depto, estar creando consultas que unen tablas simples no es difícil , pero cuando intervienen mas de 5 o mas tablas se puede realizar un proceso complicado, es mejor definir una sola vez la consulta y traerla con una view.

La sintaxis para crear una View es sencilla

CREATE VIEW nombre_view AS SELECT …………

Una vez realizada la vista esta se manda llamar por su nombre como una consulta a una tabla normal

Ejecutemos el siguiente código:

mysql> CREATE VIEW view_ejemplo AS SELECT nombre,correo,depto FROM contacto,depto WHERE contacto.id_depto=depto.id_depto;

Esto nos creara una vista con la consulta que anteriormente realizamos, una vez hecha la vista solo es cuestión de llamarla como una tabla

mysql> SELECT * from view_ejemplo;

+————+——————–+———————-+

| nombre | correo | depto |

+————+——————–+———————-+

| Juan Perez | jperez@ejemplo.com | Contabilidad |

| Pito Paez | ppaez@ejemplo.com | Mercadotecnia |

+————+——————–+———————-+

2 rows in set (0.00 sec)

Como se muestra en el ejemplo la consulta se realiza más sencilla y con la ventaja de que no hay que definir todas las sentencias para unir las tablas ya que estas quedaron almacenadas en la vista para usarse recurrentemente.

Las vistas también son actualizables es decir se ejecutamos un comando UPDATE sobre la vista esta actualizara la tabla correspondiente, sin tener nosotros que realizar algún comando adicional, veamos el siguiente ejemplo:

mysql> SELECT * from view_ejemplo;

+————+——————–+—————+

| nombre | correo | depto |

+————+——————–+—————+

| Juan Perez | jperez@ejemplo.com | Contabilidad |

| Pito Paez | ppaez@ejemplo.com | Mercadotecnia |

+————+——————–+—————+

2 rows in set (0.00 sec)

mysql> update view_ejemplo SET nombre=’Juan Perez Comun’ WHERE nombre=’Juan Perez’;

Query OK, 1 row affected (0.06 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * from view_ejemplo;

+——————+——————–+—————+

| nombre | correo | depto |

+——————+——————–+—————+

| Juan Perez Comun | jperez@ejemplo.com | Contabilidad |

| Pito Paez | ppaez@ejemplo.com | Mercadotecnia |

+——————+——————–+—————+

2 rows in set (0.00 sec)

mysql> SELECT * from contacto;

+—-+——————+——————–+———-+

| id | nombre | correo | id_depto |

+—-+——————+——————–+———-+

| 1 | Juan Perez Comun | jperez@ejemplo.com | 1 |

| 2 | Pito Paez | ppaez@ejemplo.com | 5 |

+—-+——————+——————–+———-+

2 rows in set (0.00 sec)

En este ejemplo ejecutamos una sentencia update sobre la vista para cambiar el nombre de Juan Perez por el nombre de Juan Perez Comun, el UPDATE se realiza normal sobre la vista y este afecta inmediatamente a la tabla contacto actualizando su información.

Lo mismo ocurriría si actualizamos el campo de depto actualizaría el campo de la tabla departamentos y la vista también.

mysql> update view_ejemplo SET depto=’Conta’ WHERE depto=’Contabilidad’;

Query OK, 1 row affected (0.05 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * from view_ejemplo;

+——————+——————–+—————+

| nombre | correo | depto |

+——————+——————–+—————+

| Juan Perez Comun | jperez@ejemplo.com | Conta |

| Pito Paez | ppaez@ejemplo.com | Mercadotecnia |

+——————+——————–+—————+

2 rows in set (0.00 sec)

mysql> SELECT * from depto;

+———-+—————-+

| id_depto | depto |

+———-+—————-+

| 1 | Conta |

| 2 | Finanzas |

| 3 | Administracion |

| 4 | Gerencia |

| 5 | Mercadotecnia |

+———-+—————-+

5 rows in set (0.00 sec)

El proceso de borrado sobre una vista no es posible ya que están diseñadas únicamente para desplegar información y actualizarla por lo que ejecutar una sentencia DELETE sobre la misma nos regresara un error:

mysql> INSERT INTO contacto (nombre,correo,id_depto) VALUES (‘Pedro Mtz’,’pmtz@e

jemplo.com’,2);

Query OK, 1 row affected (0.09 sec)

mysql> SELECT * from view_ejemplo;

+——————+——————–+—————+

| nombre | correo | depto |

+——————+——————–+—————+

| Juan Perez Comun | jperez@ejemplo.com | Conta |

| Pito Paez | ppaez@ejemplo.com | Mercadotecnia |

| Pedro Mtz | pmtz@ejemplo.com | Finanzas |

+——————+——————–+—————+

3 rows in set (0.00 sec)

mysql> DELETE FROM view_ejemplo WHERE correo=’pmtz@ejemplo.com’;

ERROR 1395 (HY000): Can not delete from join view ‘pruebas.view_ejemplo’

Lo mismo sucede al querer insertar datos en una vista

mysql> INSERT INTO view_ejemplo (nombre,correo,depto) VALUES (‘Daniel Sanchez’,’dsanchez@ejemplo.com’,’Conta’);

ERROR 1393 (HY000): Can not modify more than one base table through a join view ‘pruebas.view_ejemplo’

En resumen estas son las ventajas y usos de las VIEWs en MySQL 5, utilícelas para mejorar el rendimiento de su aplicación y acelerar el desarrollo de la misma , no se recomienda abusar demasiado de esta facilidad ya que después el motor de la base de datos pudiera ver afectado su desempeño, emplearse específicamente para generación de reportes.

Esta públicación tiene 4 comentarios

  1. Anonymous

    Excelente Amigo, pero revisa algo adicional para insertar en las tablas que me lo encontre en http://dev.mysql.com/doc/refman/5.0/es
    /create-view.html
    te habla de un parametro adicional para poder insertar en las vistas, tener en cuenta
    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW nombre_vista [(columnas)]
    AS sentencia_select
    [WITH [CASCADED | LOCAL] CHECK OPTION]

    Esperando haber contribuido un poco con la comunidad, me despido.

    Fred2y

  2. Anonymous

    Insertar en las «VISTAS».
    Fred2y

Responder a edprehiem88122947 Cancelar la respuesta