Capítulo 22. La base de datos de información `INFORMATION_SCHEMA`
Anterior |  | Siguiente

## Capítulo 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 carácteres (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 de datos
`DEFAULT_CHARACTER_SET_NAME` |  |
`DEFAULT_COLLATION_NAME` |  |
`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 | Remarks
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` | `Table_`... |
`TABLE_NAME` | `Table_`... |
`TABLE_TYPE` |  |
`ENGINE` | `Engine` | Extensión MySQL
`VERSION` | `Version` | Extensión MySQL
`ROW_FORMAT` | `Row_format` | Extensión MySQL
`TABLE_ROWS` | `Rows` | Extensión MySQL
`AVG_ROW_LENGTH` | `Avg_row_length` | Extensión MySQL
`DATA_LENGTH` | `Data_length` | Extensión MySQL
`MAX_DATA_LENGTH` | `Max_data_length` | Extensión MySQL
`INDEX_LENGTH` | `Index_length` | Extensión MySQL
`DATA_FREE` | `Data_free` | Extensión MySQL
`AUTO_INCREMENT` | `Auto_increment` | Extensión MySQL
`CREATE_TIME` | `Create_time` | Extensión MySQL
`UPDATE_TIME` | `Update_time` | Extensión MySQL
`CHECK_TIME` | `Check_time` | Extensión MySQL
`TABLE_COLLATION` | `Collation` | Extensión MySQL
`CHECKSUM` | `Checksum` | Extensión MySQL
`CREATE_OPTIONS` | `Create_options` | Extensión MySQL
`TABLE_COMMENT` | `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 carácteres por defecto de la tabla. `TABLE_COLLATION` se acerca, ya que los nombres de colación comienzan con el nombre del conjunto de carácteres.

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 | Remarks
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`COLUMN_NAME` | `Field` |
`ORDINAL_POSITION` |  | vea las notas
`COLUMN_DEFAULT` | `Default` |
`IS_NULLABLE` | `Null` |
`DATA_TYPE` | `Type` |
`CHARACTER_MAXIMUM_LENGTH` | `Type` |
`CHARACTER_OCTET_LENGTH` |  |
`NUMERIC_PRECISION` | `Type` |
`NUMERIC_SCALE` | `Type` |
`CHARACTER_SET_NAME` |  |
`COLLATION_NAME` | `Collation` |
`COLUMN_KEY` | `Key` | Extensión MySQL
`EXTRA` | `Extra` | Extensión MySQL
`COLUMN_COMMENT` | `Comment` | 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 carácteres 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 carácteres 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_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  | = Base de datos
`TABLE_NAME` | `Table` |
`NON_UNIQUE` | `Non_unique` |
`INDEX_SCHEMA` |  | = Base de datos
`INDEX_NAME` | `Key_name` |
`SEQ_IN_INDEX` | `Seq_in_index` |
`COLUMN_NAME` | `Column_name` |
`COLLATION` | `Collation` |
`CARDINALITY` | `Cardinality` |
`SUB_PART` | `Sub_part` | Extensión MySQL
`PACKED` | `Packed` | Extensión MySQL
`NULLABLE` | `Null` | Extensión MySQL
`INDEX_TYPE` | `Index_type` | 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 | `SHOW` name | Remarks
`GRANTEE` |  | e.g. 'user'@'host'
`TABLE_CATALOG` |  | `NULL`
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

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_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

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_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

Los siguientes comandos no son equivalentes:

    SELECT ... FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES

    SHOW GRANTS ...

`PRIVILEGE_TYPE` puede contener uno ( y sólo uno ) de estos valores: `SELECT`, `INSERT`, `UPDATE`, `REFERENCES`, `ALTER`, `INDEX`, `DROP`, `CREATE VIEW`.

### 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_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`COLUMN_NAME` |  |
`PRIVILEGE_TYPE` |  |
`IS_GRANTABLE` |  |

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 carácteres disponibles.

Standard Name | `SHOW` name | Remarks
`CHARACTER_SET_NAME` | `Charset` |
`DEFAULT_COLLATE_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 carácteres.

Standard Name | `SHOW` name | Remarks
`COLLATION_NAME` | `Collation` |

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 carácteres es aplicable a cada colación. Las columnas son equivalentes a los dos primeros campos mostrados por `SHOW COLLATION`.

Standard Name | `SHOW` name | Remarks
`COLLATION_NAME` | `Collation` |
`CHARACTER_SET_NAME` | `Charset` |

### 22.1.12. La tabla `INFORMATION_SCHEMA TABLE_CONSTRAINTS`

La tabla `TABLE_CONSTRAINTS` describe qué tablas tienen restricciones.

Standard Name | `SHOW` name | Remarks
`CONSTRAINT_CATALOG` |  | `NULL`
`CONSTRAINT_SCHEMA` |  |
`CONSTRAINT_NAME` |  |
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`CONSTRAINT_TYPE` |  |

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 | `SHOW` name | Remarks
`CONSTRAINT_CATALOG` |  | `NULL`
`CONSTRAINT_SCHEMA` |  |
`CONSTRAINT_NAME` |  |
`TABLE_CATALOG` |  |
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`COLUMN_NAME` |  |
`ORDINAL_POSITION` |  |
`POSITION_IN_UNIQUE_CONSTRAINT` |  |
`REFERENCED_TABLE_SCHEMA` |  |
`REFERENCED_TABLE_NAME` |  |
`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:

  - Un registro con `CONSTRAINT_NAME`='PRIMARY', `TABLE_NAME`='t1', `COLUMN_NAME`='s3', `ORDINAL_POSITION`=1, `POSITION_IN_UNIQUE_CONSTRAINT`=NULL.

  - 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`, y `REFERENCED_COLUMN_NAME` se añadieron en MySQL 5.0.6.

### 22.1.14. La tabla `INFORMATION_SCHEMA ROUTINES`

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 | Remarks
`SPECIFIC_NAME` | `specific_name` |
`ROUTINE_CATALOG` |  | `NULL`
`ROUTINE_SCHEMA` | `db` |
`ROUTINE_NAME` | `name` |
`ROUTINE_TYPE` | `type` | `{PROCEDURE|FUNCTION}`
`DTD_IDENTIFIER` |  | (descriptor del tipo de datos)
`ROUTINE_BODY` |  | `SQL`
`ROUTINE_DEFINITION` | `body` |
`EXTERNAL_NAME` |  | `NULL`
`EXTERNAL_LANGUAGE` | `language` | `NULL`
`PARAMETER_STYLE` |  | `SQL`
`IS_DETERMINISTIC` | `is_deterministic` |
`SQL_DATA_ACCESS` | `sql_data_access` |
`SQL_PATH` |  | `NULL`
`SECURITY_TYPE` | `security_type` |
`CREATED` | `created` |
`LAST_ALTERED` | `modified` |
`SQL_MODE` | `sql_mode` | Extensión MySQL
`ROUTINE_COMMENT` | `comment` | Extensión MySQL
`DEFINER` | `definer` | Extensión MySQL

Notas:

- MySQL calcula `EXTERNAL_LANGUAGE` así:

  - Si `mysql.proc.language='SQL'`, entonces `EXTERNAL_LANGUAGE` es `NULL`

  - 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 | Remarks
`TABLE_CATALOG` |  | `NULL`
`TABLE_SCHEMA` |  |
`TABLE_NAME` |  |
`VIEW_DEFINITION` |  |
`CHECK_OPTION` |  |
`IS_UPDATABLE` |  |

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 | Remarks
`TRIGGER_CATALOG` |  | `NULL`
`TRIGGER_SCHEMA` |  |
`TRIGGER_NAME` | `Trigger` |
`EVENT_MANIPULATION` | `Event` |
`EVENT_OBJECT_CATALOG` |  | `NULL`
`EVENT_OBJECT_SCHEMA` |  |
`EVENT_OBJECT_TABLE` | `Table` |
`ACTION_ORDER` |  | `0`
`ACTION_CONDITION` |  | `NULL`
`ACTION_STATEMENT` | `Statement` |
`ACTION_ORIENTATION` |  | `ROW`
`ACTION_TIMING` | `Timing` |
`ACTION_REFERENCE_OLD_TABLE` |  | `NULL`
`ACTION_REFERENCE_NEW_TABLE` |  | `NULL`
`ACTION_REFERENCE_OLD_ROW` |  | `OLD`
`ACTION_REFERENCE_NEW_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 `ACTION_REFERENCE_OLD_ROW` siempre contiene el valor `'OLD'` y `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 obtener información acerca de la estructura de `INFORMATION_SCHEMA` mismo.

- Varios comandos `SHOW` aceptan una cláusula `WHERE` que proporciona más flexibilidad al especificar qué registros mostrar.

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    | big5_chinese_ci     |      2 |
    | dec8     | DEC West European           | dec8_swedish_ci     |      1 |
    | cp850    | DOS West European           | cp850_general_ci    |      1 |
    | hp8      | HP West European            | hp8_english_ci      |      1 |
    | koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
    | latin1   | ISO 8859-1 West European    | 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 carácteres 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           | ujis_japanese_ci    |      3 |
    | sjis    | Shift-JIS Japanese        | sjis_japanese_ci    |      2 |
    | cp932   | SJIS for Windows Japanese | cp932_japanese_ci   |      2 |
    | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci |      3 |
    +---------+---------------------------+---------------------+--------+

Este comando muestra los conjuntos de carácteres 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           | ujis_japanese_ci    |      3 |
    | sjis    | Shift-JIS Japanese        | sjis_japanese_ci    |      2 |
    | euckr   | EUC-KR Korean             | euckr_korean_ci     |      2 |
    | gb2312  | GB2312 Simplified Chinese | gb2312_chinese_ci   |      2 |
    | gbk     | GBK Simplified Chinese    | gbk_chinese_ci      |      2 |
    | utf8    | UTF-8 Unicode             | utf8_general_ci     |      3 |
    | ucs2    | UCS-2 Unicode             | ucs2_general_ci     |      2 |
    | cp932   | SJIS for Windows Japanese | cp932_japanese_ci   |      2 |
    | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci |      3 |
    +---------+---------------------------+---------------------+--------+

Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

Anterior |  | Siguiente
Capítulo 21. Vistas (Views) | Inicio | Capítulo 23. Matemáticas de precisión