21. VISTAS (VIEWS) Las vistas (incluyendo vistas actualizables) fueron introducidas en la versión 5.0 del servidor de base de datos MySQL En este capítulo se tratan los siguientes temas: · Creación o modificación de vistas con CREATE VIEW o ALTER VIEW · Eliminación de vistas con DROP VIEW · Obtención de información de definición de una vista (metadatos) con SHOW CREATE VIEW Para obtener información sobre las restricciones en el uso de vistas consulte Apéndice H, Restricciones en características de MySQL. Si ha actualizado a MySQL 5.0.1 desde una versión anterior, debería actualizar las tablas de permisos para que contengan los privilegios relacionados con vistas. Consulte Sección 2.10.2, “Aumentar la versión de las tablas de privilegios”. 21.1. Sintaxis de ALTER VIEW ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW nombre_vista [(columnas)] AS sentencia_select [WITH [CASCADED | LOCAL] CHECK OPTION] Esta sentencia modifica la definición de una vista existente. La sintaxis es semejante a la empleada en CREATE VIEW. Consulte Sección 21.2, “Sintaxis de CREATE VIEW”. Se requiere que posea los permisos CREATE VIEW y DELETE para la vista, y algún privilegio en cada columna seleccionada por la sentencia SELECT. Esta sentencia se introdujo en MySQL 5.0.1. 21.2. Sintaxis de CREATE VIEW CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW nombre_vista [(columnas)] AS sentencia_select [WITH [CASCADED | LOCAL] CHECK OPTION] Esta sentencia crea una vista nueva o reemplaza una existente si se incluye la cláusula OR REPLACE. La sentencia_select es una sentencia SELECT que proporciona la definición de la vista. Puede estar dirigida a tablas de la base o a otras vistas. Se requiere que posea el permiso CREATE VIEW para la vista, y algún privilegio en cada columna seleccionada por la sentencia SELECT. Para columnas incluidas en otra parte de la sentencia SELECT debe poseer el privilegio SELECT. Si está presente la cláusula OR REPLACE, también deberá tenerse el privilegio DELETE para la vista. Toda vista pertenece a una base de datos. Por defecto, las vistas se crean en la base de datos actual. Pera crear una vista en una base de datos específica, indíquela con base_de_datos.nombre_vista al momento de crearla. mysql> CREATE VIEW test.v AS SELECT * FROM t; Las tablas y las vistas comparten el mismo espacio de nombres en la base de datos, por eso, una base de datos no puede contener una tabla y una vista con el mismo nombre. Al igual que las tablas, las vistas no pueden tener nombres de columnas duplicados. Por defecto, los nombres de las columnas devueltos por la sentencia SELECT se usan para las columnas de la vista . Para dar explícitamente un nombre a las columnas de la vista utilice la clásula columnas para indicar una lista de nombres separados con comas. La cantidad de nombres indicados en columnas debe ser igual a la cantidad de columnas devueltas por la sentencia SELECT. Las columnas devueltas por la sentencia SELECT pueden ser simples referencias a columnas de la tabla, pero tambien pueden ser expresiones conteniendo funciones, constantes, operadores, etc. Los nombres de tablas o vistas sin calificar en la sentencia SELECT se interpretan como pertenecientes a la base de datos actual. Una vista puede hacer referencia a tablas o vistas en otras bases de datos precediendo el nombre de la tabla o vista con el nombre de la base de datos apropiada. Las vistas pueden crearse a partir de varios tipos de sentencias SELECT. Pueden hacer referencia a tablas o a otras vistas. Pueden usar combinaciones, UNION, y subconsultas. El SELECT inclusive no necesita hacer referencia a otras tablas. En el siguiente ejemplo se define una vista que selecciona dos columnas de otra tabla, así como una expresión calculada a partir de ellas: mysql> CREATE TABLE t (qty INT, price INT); mysql> INSERT INTO t VALUES(3, 50); mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; mysql> SELECT * FROM v; +------+-------+-------+ | qty | price | value | +------+-------+-------+ | 3| 50 | 150 | +------+-------+-------+ La definición de una vista está sujeta a las siguientes limitaciones: · La sentencia SELECT no puede contener una subconsulta en su cláusula FROM. · La sentencia SELECT no puede hacer referencia a variables del sistema o del usuario. · La sentencia SELECT no puede hacer referencia a parámetros de sentencia preparados. · Dentro de una rutina almacenada, la definición no puede hacer referencia a parámetros de la rutina o a variables locales. · Cualquier tabla o vista referenciada por la definición debe existir. Sin embargo, es posible que después de crear una vista, se elimine alguna tabla o vista a la que se hace referencia. Para comprobar la definición de una vista en busca de problemas de este tipo, utilice la sentencia CHECK TABLE. · La definición no puede hacer referencia a una tabla TEMPORARY, y tampoco se puede crear una vista TEMPORARY. · Las tablas mencionadas en la definición de la vista deben existir siempre. · No se puede asociar un disparador con una vista. En la definición de una vista está permitido ORDER BY, pero es ignorado si se seleccionan columnas de una vista que tiene su propio ORDER BY. Con respecto a otras opciones o cláusulas incluidas en la definición, las mismas se agregan a las opciones o cláusulas de cualquier sentencia que haga referencia a la vista creada, pero el efecto es indefinido. Por ejemplo, si la definición de una vista incluye una cláusula LIMIT, y se hace una selección desde la vista utilizando una sentencia que tiene su propia cláusula LIMIT, no está definido cuál se aplicará. El mismo principio se extiende a otras opciones como ALL, DISTINCT, o SQL_SMALL_RESULT que se ubican a continuación de la palabra reservada SELECT, y a cláusulas como INTO, FOR UPDATE, LOCK IN SHARE MODE, y PROCEDURE. Si se crea una vista y luego se modifica el entorno de proceso de la consulta a traves de la modificación de variables del sistema, puede afectar los resultados devueltos por la vista: mysql> CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65)); Query OK, 0 rows affected (0.00 sec) mysql> SET NAMES 'latin1'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM v; +-------------------+---------------------+ | CHARSET(CHAR(65)) | COLLATION(CHAR(65)) | +-------------------+---------------------+ | latin1 | latin1_swedish_ci | +-------------------+---------------------+ 1 row in set (0.00 sec) mysql> SET NAMES 'utf8'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM v; +-------------------+---------------------+ | CHARSET(CHAR(65)) | COLLATION(CHAR(65)) | +-------------------+---------------------+ | utf8 | utf8_general_ci | +-------------------+---------------------+ 1 row in set (0.00 sec) La cláusula opcional ALGORITHM es una extensión de MySQL al SQL estándar. ALGORITHM puede tomar tres valores: MERGE, TEMPTABLE, o UNDEFINED. El algoritmo por defecto es UNDEFINED si no se encuentra presente la cláusula ALGORITHM. El algoritmo afecta la manera en que MySQL procesa la vista. Para MERGE, el texto de una sentencia que haga referencia a la vista y la definición de la vista son mezclados de forma que parte de la definición de la vista reemplaza las partes correspondientes de la consulta. Para TEMPTABLE, los resultados devueltos por la vista son colocados en una tabla temporal, la cual es luego utilizada para ejecutar la sentencia. Para UNDEFINED, MySQL determina el algoritmo que utilizará. En ese caso se prefiere MERGE por sobre TEMPTABLE si es posible, ya que MERGE por lo general es más eficiente y porque la vista no puede ser actualizable si se emplea una tabla temporal. Una razón para elegir explícitamente TEMPTABLE es que los bloqueos en tablas subyacentes pueden ser liberados despues que la tabla temporal fue creada, y antes de que sea usada para terminar el procesamiento de la sentencia. Esto podría resultar en una liberación del bloqueo más rápida que en el algoritmo MERGE, de modo que otros clientes que utilicen la vista no estarán bloqueados mucho tiempo. El algoritmo de una vista puede ser UNDEFINED en tres situaciones: · No se encuentra presente una cláusula ALGORITHMen la sentencia CREATE VIEW. · La sentencia CREATE VIEW tiene explícitamente una cláusula ALGORITHM = UNDEFINED. · Se especificó ALGORITHM = MERGE para una vista que solamente puede ser procesada usando una tabla temporal. En este caso, MySQL emite una advertencia y establece el algoritmo en UNDEFINED. Como se dijo anteriormente, MERGE provoca que las partes correspondientes de la definición de la vista se combinen dentro de la sentencia que hace referencia a la vista. El siguiente ejemplo muestra brevemente cómo funciona el algoritmo MERGE. El ejemplo asume que hay una vista v_merge con esta definición: CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS SELECT c1, c2 FROM t WHERE c3 > 100; Ejemplo 1: Suponiendo que se utilice esta sentencia: SELECT * FROM v_merge; MySQL la gestiona del siguiente modo: · v_merge se convierte en t · * se convierte en vc1, vc2, que corresponden a c1, c2 · Se agrega la cláusula WHERE de la vista La sentencia ejecutada resulta ser: SELECT c1, c2 FROM t WHERE c3 > 100; Ejemplo 2: Suponiendo que se utilice esta sentencia: SELECT * FROM v_merge WHERE vc1 < 100; Esta sentencia se gestiona en forma similar a la anterior, a excepción de que vc1 < 100 se convierte en c1 < 100 y la cláusula WHERE de la vista se agrega a la cláusula WHERE de la sentencia empleando un conector AND (y se agregan paréntesis para asegurarse que las partes de la cláusula se ejecutarán en el orden de precedencia correcto). La sentencia ejecutada resulta ser: SELECT c1, c2 FROM t WHERE (c3 > 100) AND (c1 < 100); Necesariamente, la sentencia a ejecutar tiene una cláusula WHERE con esta forma: WHERE (WHERE de la sentencia) AND (WHERE de la vista) El algoritmo MERGE necesita una relación uno-a-uno entre los registros de la vista y los registros de la tabla subyacente. Si esta relación no se sostiene, debe emplear una tabla temporal en su lugar. No se tendrá una relación uno-a-uno si la vista contiene cualquiera de estos elementos: · Funciones agregadas (SUM(), MIN(), MAX(), COUNT(), etcétera) · DISTINCT · GROUP BY · HAVING · UNION o UNION ALL · Hace referencia solamente a valores literales (en tal caso, no hay una tabla subyacente) Algunas vistas son actualizables. Esto significa que se las puede emplear en sentencias como UPDATE, DELETE, o INSERT para actualizar el contenido de la tabla subyacente. Para que una vista sea actualizable, debe haber una relación uno-a-uno entre los registros de la vista y los registros de la tabla subyacente. Hay otros elementos que impiden que una vista sea actualizable. Más específicamente, una vista no será actualizable si contiene: · Funciones agregadas (SUM(), MIN(), MAX(), COUNT(), etcétera) · DISTINCT · GROUP BY · HAVING · UNION o UNION ALL · Una subconsulta en la lista de columnas del SELECT · Join · Una vista no actualizable en la cláusula FROM · Una subconsulta en la cláusula WHERE que hace referencia a una tabla en la cláusula FROM · Hace referencia solamente a valores literales (en tal caso no hay una) tabla subyacenta para actualizar. · ALGORITHM = TEMPTABLE (utilizar una tabla temporal siempre resulta en una vista no actualizable) Con respecto a la posibilidad de agregar registros mediante sentencias INSERT, es necesario que las columnas de la vista actualizable también cumplan los siguientes requisitos adicionales: · No debe haber nombres duplicados entre las columnas de la vista. · La vista debe contemplar todas las columnas de la tabla en la base de datos que no tengan indicado un valor por defecto. · Las columnas de la vista deben ser referencias a columnas simples y no columnas derivadas. Una columna derivada es una que deriva de una expresión. Estos son algunos ejemplos de columnas derivadas: · 3.14159 · col1 + 3 · UPPER(col2) · col3 / col4 · (subquery) No puede insertar registros en una vista conteniendo una combinación de columnas simples y derivadas, pero puede actualizarla si actualiza únicamente las columnas no derivadas. Considere esta vista: CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t; En esta vista no pueden agregarse registros porque col2 es derivada de una expresión. Pero será actualizable si no intenta actualizar col2. Esta actualización es posible: UPDATE v SET col1 = 0; Esta actualización no es posible porque se intenta realizar sobre una columna derivada: UPDATE v SET col2 = 0; A veces, es posible que una vista compuesta por múltiples tablas sea actualizable, asumiendo que es procesada con el algoritmo MERGE. Para que esto funcione, la vista debe usar inner join (no outer join o UNION). Además, solamente puede actualizarse una tabla de la definición de la vista, de forma que la cláusula SET debe contener columnas de sólo una tabla de la vista. Las vistas que utilizan UNION ALL no se pueden actualizar aunque teóricamente fuese posible hacerlo, debido a que en la implementación se emplean tablas temporales para procesarlas. En vistas compuestas por múltiples tablas, INSERT funcionará si se aplica sobre una única tabla. DELETE no está soportado. La cláusula WITH CHECK OPTION puede utilizarse en una vista actualizable para evitar inserciones o actualizaciones excepto en los registros en que la cláusula WHERE de la sentencia_select se evalúe como true. En la cláusula WITH CHECK OPTION de una vista actualizable, las palabras reservadas LOCAL y CASCADED determinan el alcance de la verificación cuando la vista está definida en términos de otras vistas. LOCAL restringe el CHECK OPTION sólo a la vista que está siendo definida. CASCADED provoca que las vistas subyacentes también sean verificadas. Si no se indica, el valor por defecto es CASCADED. Considere las siguientes definiciones de tabla y vistas: 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; Las vistas v2 y v3 estan definidas en términos de otra vista, v1. v2 emplea check option LOCAL, por lo que las inserciones sólo atraviesan la verificación de v2 . v3 emplea check option CASCADED de modo que las inserciones no solamente atraviesan su propia verificación sino tambien las de las vistas subyacentes. Las siguientes sentencias demuestran las diferencias: ql> 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' La posibilidad de actualización de las vistas puede verse afectada por el valor de la variable del sistema updatable_views_with_limit. Consulte Sección 5.3.3, “Variables de sistema del servidor”. La sentencia CREATE VIEW fue introducida en MySQL 5.0.1. La cláusula WITH CHECK OPTION fue implementada en MySQL 5.0.2. INFORMATION_SCHEMA contiene una tabla VIEWS de la cual puede obtenerse información sobre los objetos de las vistas. Consulte Sección 22.1.15, “La tabla INFORMATION_SCHEMA VIEWS”. 21.3. Sintaxis de DROP VIEW DROP VIEW [IF EXISTS] nombre_vista [, nombre_vista] ... [RESTRICT | CASCADE] DROP VIEW elimina una o más vistas de la base de datos. Se debe poseer el privilegio DROP en cada vista a eliminar. La cláusula IF EXISTS se emplea para evitar que ocurra un error por intentar eliminar una vista inexistente. Cuando se utiliza esta cláusula, se genera una NOTE por cada vista inexistente. Consulte Sección 13.5.4.22, “Sintaxis de SHOW WARNINGS”. RESTRICT y CASCADE son ignoradas. Esta sentencia se introdujo en MySQL 5.0.1. 21.4. Sintaxis de SHOW CREATE VIEW SHOW CREATE VIEW nombre_vista Muestra la sentencia CREATE VIEW que se utilizó para crear la vista. mysql> SHOW CREATE VIEW v; +-------+----------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------+ |v | CREATE VIEW `test`.`v` AS select 1 AS `a`,2 AS `b` | +-------+----------------------------------------------------+ Esta sentencia fue introducida en MySQL 5.0.1. 22. La base de datos de información INFORMATION_SCHEMA El soporte para INFORMATION_SCHEMA está disponible en MySQL 5.0.2 y posterior. Proporciona acceso a los metadatos de la base de datos. Metadatos son datos acerca de los datos, tales como el nombre de la base de datos o tabla, el tipo de datos de una columna, o permisos de acceso. Otros términos que a veces se usan para esta información son diccionario de datos o catálogo del sistema . Ejemplo: mysql> SELECT table_name, table_type, engine -> FROM information_schema.tables -> WHERE table_schema = 'db5' -> ORDER BY table_name DESC; +------------+------------+--------+ | table_name | table_type | engine | +------------+------------+--------+ | v56 | VIEW | NULL | | v3 | VIEW | NULL | | v2 | VIEW | NULL | |v | VIEW | NULL | | tables | BASE TABLE | MyISAM | | t7 | BASE TABLE | MyISAM | | t3 | BASE TABLE | MyISAM | | t2 | BASE TABLE | MyISAM | |t | BASE TABLE | MyISAM | | pk | BASE TABLE | InnoDB | | loop | BASE TABLE | MyISAM | | kurs | BASE TABLE | MyISAM | |k | BASE TABLE | MyISAM | | into | BASE TABLE | MyISAM | | goto | BASE TABLE | MyISAM | | fk2 | BASE TABLE | InnoDB | | fk | BASE TABLE | InnoDB | +------------+------------+--------+ 17 rows in set (0.01 sec) Explicación: El comando pide una lista de todas las tablas en la base de datos db5, en orden alfabético inverso, mostrando tres informaciones: el nombre de la tabla, su tipo y su motor. INFORMATION_SCHEMA es la base de datos de información, que almacena información acerca de todas las otras bases de datos que mantiene el servidor MySQL . Dentro del INFORMATION_SCHEMA hay varias tablas de sólo lectura. En realidad son vistas, no tablas, así que no puede ver ningún fichero asociado con ellas. Cada usuario MySQL tiene derecho a acceder a estas tablas, pero sólo a los registros que se corresponden a los objetos a los que tiene permiso de acceso. Ventajas de SELECT El comando SELECT ... FROM INFORMATION_SCHEMA es una forma más consistente de proporcionar acceso a la información proporcionada por los comandos SHOW que soporta MySQL (SHOW DATABASES, SHOW TABLES, y así). Usar SELECT tiene las siguientes ventajas, en comparación a SHOW: · Cumple las reglas de Codd. Esto es, todo acceso se hace por tabla. · Nadie necesita aprender una nueva sintaxis. Conocen cómo funciona SELECT , sólo necesitan aprender los nombres de los objetos. · El implementador no tiene que preocuparse de palabras clave. · Hay millones de variaciones de la salida, en lugar de sólo una. Esto proporciona flexibilidad a las aplicaciones con requerimientos cambiantes acerca de los metadatos que necesitan · La migración es más fácil ya que todos los otros DBMS funcionan así. Sin embargo, como SHOW es popular entre los empleados y usuarios de MySQL, y como puede ser confuso si desaparece, las ventajas de una sintaxis convencional no es razón para eliminar SHOW. De hecho, hay mejoras a SHOW en MySQL 5.0. Se describen en Sección 22.2, “Extensiones a las sentencias SHOW ”. Estandars La implementación de la estructura de tablas para el INFORMATION_SCHEMA en MySQL sigue el estándar ANSI/ISO SQL:2003 Parte 11 Schemata. Nuestra intención es aproximar el cumplimiento de SQL:2003 característica básica F021 Basic information schema. Los usuarios de SQL Server 2000 (que también sigue el estándar) pueden ver una gran similitud. Sin embargo, MySQL omite varias columnas no relevantes para nuestra implementación, y añade columnas que són específicas de MySQL. Una de estas columnas es engine en la tabla INFORMATION_SCHEMA.TABLES. Aunque otros DBMS usan una variedad de nombres, como syscat o system, el nombre estándar es INFORMATION_SCHEMA. En efecto, tenemos una nueva base de datos llamada INFORMATION_SCHEMA, aunque no hay necesidad de hacer un fichero llamado así. Es posible seleccionar INFORMATION_SCHEMA como base de datos por defecto con un comando USE , pero la única forma de acceder al contenido de sus tablas es con SELECT. No puede insertar, actualizar o borrar su contenido. Permisos No hay diferencia entre el requerimiento de permisos para (SHOW) y para SELECT . En cada caso, debe tener algún permiso de un objeto para consultar información acerca de el mismo. 22.1. Las tablas INFORMATION_SCHEMA Explicación de las siguientes secciones En las siguientes secciones, tomamos tablas y columnas del INFORMATION_SCHEMA. Para cada columna, hay tres informaciones: · “Standard Name” indica el nombre SQL estándar para la columna. · “SHOW name” indica el nombre equivalente al comando SHOW más parecido, si lo hay. · “Remarks” proporciona información adicional donde sea aplicable. Para evitar usar nombres reservados del estándar o de DB2, SQL Server, o Oracle, hemos cambiado los nombres de las columnas marcados como extensión MySQL. (Por ejemplo, cambiamos COLLATION a TABLE_COLLATION en la tabla TABLES .) Consulte la lista de palabras reservadas al final del artículo: http://www.dbazine.com/gulutzan5.shtml. La definición para columnas de caracteres (por ejemplo, TABLES.TABLE_NAME), generalmente es VARCHAR(N) CHARACTER SET utf8 donde N es como mínimo 64. Cada sección indica qué comando SHOW es equivalente al SELECT que proporciona información de INFORMATION_SCHEMA, o si no hay tal equivalente. Nota: Por ahora, hay algunas columnas no presentes y algunas que no funcionan. Estamos trabajando en ello y tratamos de actualizar la documentación tal y como se producen los cambios. 22.1.1. La tabla INFORMATION_SCHEMA SCHEMATA Un esquema es una base de datos, así que la tabla SCHEMATA proporciona información acerca de bases de datos. Standard Name SHOW name Remarks CATALOG_NAME - NULL SCHEMA_NAME base datos de DEFAULT_CHARACTER_ SET_NAME DEFAULT_COLLATION_N AME SQL_PATH NULL Notas: · Para SQL_PATH, podemos soportar eventualmente algo en MySQL 5.x. De momento siempre es NULL. · DEFAULT_COLLATION_NAME se añadió en MySQL 5.0.6. Los siguientes comandos son equivalentes: SELECT SCHEMA_NAME AS `Database` FROM INFORMATION_SCHEMA.SCHEMATA [WHERE SCHEMA_NAME LIKE 'wild'] SHOW DATABASES [LIKE 'wild'] 22.1.2. La tabla INFORMATION_SCHEMA TABLES La tabla TABLES proporciona información acerca de las tablas en las bases de datos. Standard Name SHOW name TABLE_CATA LOG Remarks NULL TABLE_SCHE MA Table_... TABLE_NAME Table_... TABLE_TYPE ENGINE Engine Extensión MySQL VERSION Version Extensión MySQL ROW_FORMA T Row_format Extensión MySQL TABLE_ROWS Rows Extensión MySQL AVG_ROW_LE NGTH Avg_row_le ngth Extensión MySQL DATA_LENGT H Data_length Extensión MySQL MAX_DATA_L ENGTH Max_data_l ength Extensión MySQL INDEX_LENGT H Index_lengt h Extensión MySQL DATA_FREE Data_free Extensión MySQL AUTO_INCRE MENT Auto_incre ment Extensión MySQL CREATE_TIM E Create_time Extensión MySQL UPDATE_TIM E Update_tim e Extensión MySQL CHECK_TIME Check_time Extensión MySQL TABLE_COLL ATION Collation Extensión MySQL CHECKSUM Checksum Extensión MySQL CREATE_OPTI ONS Create_opti ons Extensión MySQL TABLE_COM MENT Comment Extensión MySQL Notas: · TABLE_SCHEMA y TABLE_NAME son campos simples en SHOW , por ejemplo Table_in_db1. · TABLE_TYPE debe ser BASE TABLE o VIEW. Si la tabla es temporal, entonces TABLE_TYPE = TEMPORARY. (No hay vistas temporales, así que no es ambíguo.) · La columna TABLE_ROWS es NULL si la tabla está en la base de datos INFORMATION_SCHEMA . · No tneemos nada para el conjunto de caracteres por defecto de la tabla. TABLE_COLLATION se acerca, ya que los nombres de colación comienzan con el nombre del conjunto de caracteres. Los siguientes comandos son equivalentes: SELECT table_name FROM INFORMATION_SCHEMA.TABLES [WHERE table_schema = 'db_name'] [WHERE|AND table_name LIKE 'wild'] SHOW TABLES [FROM db_name] [LIKE 'wild'] 22.1.3. La tabla INFORMATION_SCHEMA COLUMNS La tabla COLUMNS proporciona información acerca de columnas en tablas. Standard Name SHOW name TABLE_CATALOG Remarks NULL TABLE_SCHEMA TABLE_NAME COLUMN_NAME Field ORDINAL_POSITION vea las notas COLUMN_DEFAULT Default IS_NULLABLE Null DATA_TYPE Type CHARACTER_MAXIMU M_LENGTH Type CHARACTER_OCTET_L ENGTH NUMERIC_PRECISION Type NUMERIC_SCALE Type CHARACTER_SET_NA ME COLLATION_NAME Collation COLUMN_KEY Key Extensión MySQL EXTRA Extra Extensión MySQL COLUMN_COMMENT Commen t Extensión MySQL Notas: · En SHOW, el Type incluye valores de varias columnas COLUMNS distintas. · ORDINAL_POSITION es necesario ya que puede algún día querer decir ORDER BY ORDINAL_POSITION. Al contrario que SHOW, SELECT no tiene ordenación automática. · CHARACTER_OCTET_LENGTH debe ser el mismo que CHARACTER_MAXIMUM_LENGTH, excepto para conjuntos de caracteres de múltiples bytes. · CHARACTER_SET_NAME puede derivarse de Collation. Por ejemplo, si dice SHOW FULL COLUMNS FROM t, y ve en la columna Collation un valor de latin1_swedish_ci, el conjunto de caracteres es lo que hay antes del primer subrayado: latin1. Los siguientes comandos son casi equivalentes: SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_name' [AND table_schema = 'db_name'] [AND column_name LIKE 'wild'] SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] 22.1.4. La tabla INFORMATION_SCHEMA STATISTICS La tabla STATISTICS proporciona información acerca de los índices de las tablas. Standard Name SHOW name Remarks TABLE_CAT ALOG NULL TABLE_SCH EMA = Base datos de = Base datos de TABLE_NA ME Table NON_UNIQ UE Non_uniq ue INDEX_SCH EMA INDEX_NAM E Key_nam e SEQ_IN_IND EX Seq_in_in dex COLUMN_N AME Column_n ame COLLATION Collation CARDINALI TY Cardinalit y SUB_PART Sub_part Extensión MySQL PACKED Packed Extensión MySQL NULLABLE Null Extensión MySQL INDEX_TYP E Index_typ e Extensión MySQL COMMENT Comment Extensión MySQL Notas: · No hay una tabla estándar para índices. La lista precedente es similar a lo que retorna SQL Server 2000 para sp_statistics, excepto que hemos cambiado el nombre QUALIFIER con CATALOG y OWNER con SCHEMA. Claramente, la tabla precedente y la salida de SHOW INDEX se derivan del mismo padre. Así que la correlación está cercana. Los siguientes comandos son equivalentes: SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name = 'tbl_name' [AND table_schema = 'db_name'] SHOW INDEX FROM tbl_name [FROM db_name] 22.1.5. La tabla INFORMATION_SCHEMA USER_PRIVILEGES La tabla USER_PRIVILEGES proporciona información acerca de permisos globales. Esta información viene de la tabla de permisos mysql.user . Standard Name GRANTEE SHOW name Remarks e.g. 'user'@'host' TABLE_CAT ALOG NULL PRIVILEGE_ TYPE IS_GRANTA BLE Notas: · Esta tabla no es estándar. Toma sus valores de la tabla mysql.user . 22.1.6. La tabla INFORMATION_SCHEMA SCHEMA_PRIVILEGES La tabla SCHEMA_PRIVILEGES proporciona información acerca del esquema de permisos (base de datos). Esta información viene de la tabla de permisos mysql.db . Standard Name SHOW name Remarks GRANTEE e.g. 'user'@'host' TABLE_CAT ALOG NULL TABLE_SCH EMA PRIVILEGE_ TYPE IS_GRANTA BLE Notas: · Esta tabla no es estándar. Toma sus valores de la tabla mysql.db . 22.1.7. La tabla INFORMATION_SCHEMA TABLE_PRIVILEGES La tabla TABLE_PRIVILEGES proporciona información de permisos de tablas. Esta información viene de la tabla de permisos mysql.tables_priv . Standard Name SHOW name Remarks GRANTEE e.g. 'user'@'host' TABLE_CAT ALOG NULL TABLE_SCH EMA TABLE_NA ME PRIVILEGE_ TYPE IS_GRANTA BLE Los siguientes comandos no son equivalentes: 22.1.8. La tabla INFORMATION_SCHEMA COLUMN_PRIVILEGES La tabla COLUMN_PRIVILEGES proporciona información acerca de permisos de columnas. Esta información viene de la tabla de permisos mysql.columns_priv . Standard Name SHOW name Remarks GRANTEE e.g. 'user'@'host' TABLE_CAT ALOG NULL TABLE_SCH EMA TABLE_NA ME COLUMN_N AME PRIVILEGE_ TYPE IS_GRANTA BLE Notas: · En la salida de SHOW FULL COLUMNS, los permisos están todos en un campo y en minúsculas, por ejemplo, select,insert,update,references. En COLUMN_PRIVILEGES, hay un registro por permiso, y en mayúsculas. · PRIVILEGE_TYPE puede contener uno ( y sólo uno ) de estos valores: SELECT, INSERT, UPDATE, REFERENCES. · Si el usuario tiene el permiso GRANT OPTION , entonces IS_GRANTABLE debe ser YES. De otro modo, IS_GRANTABLE debe ser NO. La salida no lista GRANT OPTION como permisos separado. Los siguientes comandos no son equivalentes: SELECT ... FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES SHOW GRANTS ... 22.1.9. La tabla INFORMATION_SCHEMA CHARACTER_SETS La tabla CHARACTER_SETS proporciona información acerca de los conjuntos de caracteres disponibles. Standard Name SHOW name Remarks CHARACTER_SET_ NAME Charset DEFAULT_COLLAT E_NAME Default collation DESCRIPION Description Extensión MySQL MAXLEN Maxlen Extensión MySQL Notas: · Hemos añadido dos columnas no estándar que se corresponden a Description y Maxlen en la salida de SHOW CHARACTER SET. Los siguientes comandos son equivalentes: SELECT * FROM INFORMATION_SCHEMA.CHARACTER_SETS [WHERE name LIKE 'wild'] SHOW CHARACTER SET [LIKE 'wild'] 22.1.10. La tabla INFORMATION_SCHEMA COLLATIONS La tabla COLLATIONS proporciona información acerca de colaciones para cada conjunto de caracteres. Standard Name SHOW name COLLATION _NAME Collation Remarks Notas: · Hemos añadido cinco columnas no estándar que se corresponden a Charset, Id, Default, Compiled, y Sortlen de la salida de SHOW COLLATION. Los siguientes comandos son equivalentes: SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATIONS [WHERE collation_name LIKE 'wild'] SHOW COLLATION [LIKE 'wild'] 22.1.11. La tabla INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY La tabla COLLATION_CHARACTER_SET_APPLICABILITY indica qué conjunto de caracteres es aplicable a cada colación. Las columnas son equivalentes a los dos primeros campos mostrados por SHOW COLLATION. Standard Name SHOW name COLLATION_NA ME Collation Remarks CHARACTER_SE T_NAME Charset 22.1.12. La tabla INFORMATION_SCHEMA TABLE_CONSTRAINTS La tabla TABLE_CONSTRAINTS describe qué tablas tienen restricciones. Standard Name SHOW name CONSTRAINT_C ATALOG Remarks NULL CONSTRAINT_S CHEMA CONSTRAINT_N AME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TY PE Notas: · El valor CONSTRAINT_TYPE puede ser UNIQUE, PRIMARY KEY, o FOREIGN KEY. · La información UNIQUE y PRIMARY KEY es acerca de lo mismo que obtiene del campo Key_name en la salida de SHOW INDEX cuando el campo Non_unique es 0. · La columna CONSTRAINT_TYPE puede contener uno de estos valores: UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK. Esta es una columna CHAR (no ENUM) . El valor CHECK no estará disponible hasta que soportemos CHECK. 22.1.13. La tabla INFORMATION_SCHEMA KEY_COLUMN_USAGE La tabla KEY_COLUMN_USAGE describe qué columnas clave tienen restricciones. Standard Name CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION SHOW name Remarks NULL POSITION_IN_UNIQUE_C ONSTRAINT REFERENCED_TABLE_S CHEMA REFERENCED_TABLE_N AME REFERENCED_COLUMN_ NAME Notas: · Si la restricción es una clave foránea, entonces esta es la columna de la clave foránea, no la columna a la que la clave foránea hace referencia. · El valor de ORDINAL_POSITION es la posición de la columna en la restricción, no la posición de la columna en la tabla. Las posiciones de columnas se numeran comenzando por 1. · El valor de POSITION_IN_UNIQUE_CONSTRAINT es NULL para restricciones de claves primárias y únicas. Para restricciones de claves foráneas, es la posición ordinal en la clave de la tabla a la que se referencia. Por ejemplo, suponga que hay dos tablas llamadas t1 y t3 con las siguientes definiciones: CREATE TABLE t1 ( s1 INT, s2 INT, s3 INT, PRIMARY KEY(s3) ) ENGINE=InnoDB; CREATE TABLE t3 ( s1 INT, s2 INT, s3 INT, KEY(s1), CONSTRAINT CO FOREIGN KEY (s2) REFERENCES t1(s3) ) ENGINE=InnoDB; Para estas dos tablas, la tabla KEY_COLUMN_USAGE tiene dos registros: o Un registro con CONSTRAINT_NAME='PRIMARY', TABLE_NAME='t1', COLUMN_NAME='s3', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=NULL. o Un registro con CONSTRAINT_NAME='CO', TABLE_NAME='t3', COLUMN_NAME='s2', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=1. § REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME se añadieron en MySQL 5.0.6. 22.1.14. La tabla INFORMATION_SCHEMA ROUTINES y La tabla ROUTINES proporciona información acerca de rutinas almacenadas (procedimientos y funciones). La tabla ROUTINES no incluye funciones definidas por el usuario (UDFs) de momento. La columna llamada “mysql.proc name” indica la columna de la tabla mysql.proc que se corresponde a la columna de la tabla INFORMATION_SCHEMA.ROUTINES, si hay alguna. Standard Name mysql.proc name SPECIFIC_NAM E specific_na me ROUTINE_CATA LOG Remarks NULL ROUTINE_SCHE MA db ROUTINE_NAME name ROUTINE_TYPE type {PROCEDURE| FUNCTION} DTD_IDENTIFIE R (descriptor del tipo de datos) ROUTINE_BODY SQL ROUTINE_DEFI NITION body EXTERNAL_NA ME EXTERNAL_LAN GUAGE NULL language PARAMETER_S TYLE NULL SQL IS_DETERMINIS TIC is_determini stic SQL_DATA_ACC ESS sql_data_ac cess SQL_PATH NULL SECURITY_TYP E security_typ e CREATED created LAST_ALTERED modified SQL_MODE sql_mode Extensión MySQL ROUTINE_COM MENT comment Extensión MySQL DEFINER definer Extensión MySQL Notas: · MySQL calcula EXTERNAL_LANGUAGE así: o Si mysql.proc.language='SQL', entonces EXTERNAL_LANGUAGE es NULL o En caso contrario, EXTERNAL_LANGUAGE es lo que hay en mysql.proc.language. Sin embargo, no tenemos idiomas externos de momento, así que siempre es NULL. 22.1.15. La tabla INFORMATION_SCHEMA VIEWS La tabla VIEWS proporciona información acerca de las vistas en las bases de datos. Standard Name SHOW name TABLE_CAT ALOG Remarks NULL TABLE_SCH EMA TABLE_NA ME VIEW_DEFI NITION CHECK_OP TION IS_UPDATA BLE Notas: · Hay un nuevo permiso, SHOW VIEW, sin el cual no puede ver la tabla VIEWS. · La columna VIEW_DEFINITION tiene la mayoría de lo que ve en el campo Create Table que produce SHOW CREATE VIEW . Ignora las palabras antes de SELECT y tras WITH CHECK OPTION. Por ejemplo, si el comando original era: · CREATE VIEW v AS · SELECT s2,s1 FROM t · WHERE s1 > 5 · ORDER BY s1 · WITH CHECK OPTION; entonces la definición de la vista es: SELECT s2,s1 FROM t WHERE s1 > 5 ORDER BY s1 · La columna CHECK_OPTION siempre tiene un valor de NONE. · La columna IS_UPDATABLE es YES si la vista es actualizable, NO si la vista no es actualizable. 22.1.16. La tabla INFORMATION_SCHEMA TRIGGERS La tabla TRIGGERS proporciona información acerca de disparadores. Esta tabla se implementó inicialmente en MySQL 5.0.10. Debe tener el permiso SUPER para ver esta tabla. Standard Name SHOW name TRIGGER_CATALOG Remarks NULL TRIGGER_SCHEMA TRIGGER_NAME Trigger EVENT_MANIPULATION Event EVENT_OBJECT_CATAL OG NULL EVENT_OBJECT_SCHEM A EVENT_OBJECT_TABLE Table ACTION_ORDER 0 ACTION_CONDITION NULL ACTION_STATEMENT Stateme nt ACTION_ORIENTATION ACTION_TIMING ROW Timing ACTION_REFERENCE_O LD_TABLE NULL ACTION_REFERENCE_N EW_TABLE NULL ACTION_REFERENCE_O LD_ROW OLD ACTION_REFERENCE_N EW_ROW NEW CREATED NULL (0) Notas: · Las columnas TRIGGER_SCHEMA y TRIGGER_NAME contienen el nombre de la base de datos en que se produce el dispardor, y el nombre del disparador, respectivamente. · La columna EVENT_MANIPULATION contiene uno de los valores 'INSERT', 'DELETE', o 'UPDATE'. · Como se explica en Capítulo 20, Disparadores (triggers), cada disparador se asocia exactamente con una tabla. Las columnas EVENT_OBJECT_SCHEMA y EVENT_OBJECT_TABLE contienen la base de datos en que ocurre esta tabla, y el nombre de la tabla. · El comando ACTION_ORDER contiene la posición ordinal de la acción del disparador en la lista de todos los disparadores similares en la misma tabla. Actualmente, este valor siempre es 0, porque no es posible tener más de un disparador con el mismo EVENT_MANIPULATION y ACTION_TIMING en la misma tabla. · La columna ACTION_STATEMENT contiene el comando a ejecutarse cuando el disparador se invoca. Esto es lo mismo que el texto mostrado en la columna Statement de la salida de SHOW TRIGGERS. Tenga en cuenta que este texto usa codificación UTF-8 . · La columna ACTION_ORIENTATION siempre contiene el valor 'ROW'. · La columna ACTION_TIMING contiene uno de los dos valores 'BEFORE' o 'AFTER'. · Las columnas ACTION_REFERENCE_OLD_ROW y ACTION_REFERENCE_NEW_ROW contienen el antiguo y nuevo identificador de columna, respectivamente. Esto significa que siempre contiene el valor y ACTION_REFERENCE_OLD_ROW 'OLD' ACTION_REFERENCE_NEW_ROW siempre contiene el valor 'NEW'. · Las siguientes columnas actualmente siempre contiene NULL: TRIGGER_CATALOG, EVENT_OBJECT_CATALOG, ACTION_CONDITION, ACTION_REFERENCE_OLD_TABLE, ACTION_REFERENCE_NEW_TABLE, y CREATED. Ejemplo, usando el disparador ins_sum definido en Sección 20.3, “Utilización de disparadores”: mysql> SELECT * FROM INFORMATION_SCHEMA.TRIGGERS\G *************************** 1. row *************************** TRIGGER_CATALOG: NULL TRIGGER_SCHEMA: test TRIGGER_NAME: ins_sum EVENT_MANIPULATION: INSERT EVENT_OBJECT_CATALOG: NULL EVENT_OBJECT_SCHEMA: test EVENT_OBJECT_TABLE: account ACTION_ORDER: 0 ACTION_CONDITION: NULL ACTION_STATEMENT: SET @sum = @sum + NEW.amount ACTION_ORIENTATION: ROW ACTION_TIMING: BEFORE ACTION_REFERENCE_OLD_TABLE: NULL ACTION_REFERENCE_NEW_TABLE: NULL ACTION_REFERENCE_OLD_ROW: OLD ACTION_REFERENCE_NEW_ROW: NEW CREATED: NULL 1 row in set (1.54 sec) Consulte Sección 13.5.4.20, “Sintaxis de SHOW TRIGGERS”. 22.1.17. Otras tablas INFORMATION_SCHEMA Pretendemos implementar tablas adicionales INFORMATION_SCHEMA . En particular, sabemos de la necesidad de INFORMATION_SCHEMA.PARAMETERS y INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS. 22.2. Extensiones a las sentencias SHOW Algunas extensiones de comandos SHOW acompañan la implementación de INFORMATION_SCHEMA: · SHOW puede usarse para INFORMATION_SCHEMA mismo. · Varios comandos SHOW aceptan una cláusula WHERE que proporciona más flexibilidad al especificar qué registros mostrar. obtener información acerca de la estructura de Estas extensiones están disponibles desde MySQL 5.0.3. INFORMATION_SCHEMA es una base de datos de información, así que su nombre se incluye en la salida de SHOW DATABASES. Similarmente, SHOW TABLES puede usarse con INFORMATION_SCHEMA para obtener una lista de sus tablas: mysql> SHOW TABLES FROM INFORMATION_SCHEMA; +---------------------------------------+ | Tables_in_information_schema | +---------------------------------------+ | SCHEMATA | | TABLES | | COLUMNS | | CHARACTER_SETS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | ROUTINES | | STATISTICS | | VIEWS | TRIGGERS | | | USER_PRIVILEGES | | SCHEMA_PRIVILEGES | TABLE_PRIVILEGES | | | COLUMN_PRIVILEGES | | TABLE_CONSTRAINTS | | KEY_COLUMN_USAGE | +---------------------------------------+ SHOW COLUMNS y DESCRIBE pueden mostrar información acerca de las columns en tablas INFORMATION_SCHEMA individuales. Varios comandos SHOW se han extendido para permitir cláusulas WHERE : SHOW CHARACTER SET SHOW COLLATION SHOW COLUMNS SHOW DATABASES SHOW FUNCTION STATUS SHOW KEYS SHOW OPEN TABLES SHOW PROCEDURE STATUS SHOW STATUS SHOW TABLE STATUS SHOW TABLES SHOW VARIABLES La cláusula WHERE , si está presente, se evalúa contra los nombres de columna mostrados por el comando SHOW. Por ejemplo, el comando SHOW COLLATION produce estas columnas de salida: Por ejemplo, el comando SHOW CHARACTER SET produce estas columnas de salida: mysql> SHOW CHARACTER SET; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | dec8 | DEC West European | cp850 | DOS West European | big5_chinese_ci | 2| | dec8_swedish_ci | | cp850_general_ci | hp8 | HP West European | hp8_english_ci | koi8r | KOI8-R Relcom Russian | latin1 | ISO 8859-1 West European 1| | | | koi8r_general_ci 1| 1| | 1| | latin1_swedish_ci | 1| | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1| ... Para usar una cláusula WHERE con SHOW CHARACTER SET, se referiría a esos nombres de columna. Como ejemplo, el siguiente comando muestra información acerca de conjuntos de caracteres para los que la colación por defecto contiene la cadena "japanese": mysql> SHOW CHARACTER SET WHERE `Default collation` LIKE '%japanese%'; +---------+---------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+---------------------------+---------------------+--------+ | ujis | EUC-JP Japanese | sjis | Shift-JIS Japanese | ujis_japanese_ci | sjis_japanese_ci | 3| | 2| | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 2| 3| +---------+---------------------------+---------------------+--------+ Este comando muestra los conjuntos de caracteres de múltiples bytes: mysql> SHOW CHARACTER SET WHERE Maxlen > 1; +---------+---------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+---------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2| | ujis | EUC-JP Japanese | sjis | Shift-JIS Japanese | ujis_japanese_ci | sjis_japanese_ci | euckr | EUC-KR Korean | 3| | 2| | euckr_korean_ci | 2| | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | | gbk | GBK Simplified Chinese | utf8 | UTF-8 Unicode | ucs2 | UCS-2 Unicode | gbk_chinese_ci | utf8_general_ci | ucs2_general_ci | | 2| 2| 3| | 2| | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | +---------+---------------------------+---------------------+--------+ 2| 3|