¿Cómo obtener una lista de vistas MySQL?

127

Estoy buscando una manera de enumerar todas las vistas en una base de datos.

Inicialmente encontré e intenté una respuesta en los foros de MySQL :

SELECT table_name
FROM information_schema.views
WHERE information_schema.views.table_schema LIKE 'view%';

Cómo siempre esto no funciona, devolviendo un conjunto vacío. (¡Sé que están ahí!)

Estos también fallan:

mysql> use information_schema;
Database changed
mysql> select * from views;
ERROR 1102 (42000): Incorrect database name 'mysql.bak'
mysql> select * from tables;
ERROR 1102 (42000): Incorrect database name 'mysql.bak'

¿Por qué no funciona esto?

AnnanFay
fuente
enlace esto puede ayudar
SHASHI SHEKHAR Barnwal

Respuestas:

27

Aquí hay una manera de encontrar todas las vistas en cada base de datos en su instancia:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.tables 
WHERE TABLE_TYPE LIKE 'VIEW';
Valerie Parham-Thompson
fuente
44
Si desea restringir la búsqueda a una determinada base de datos para obtener una respuesta a la pregunta planteada, agregue AND TABLE_SCHEMA LIKE 'database_name'.
Gruber
Para complementar o recuperar más datos sobre la vista, considere: stackoverflow.com/questions/2834016/…
Manuel Jordan
7
 select * FROM information_schema.views\G; 
zloctb
fuente
7

Esto funcionará

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';
Sameera Sampath
fuente
2
Esto es mejor, ya que puedo manipularlo para 'SHOW CREATE' con concat.
Moshe L
1
Misma respuesta queValerie Parham-Thompson
Manuel Jordan
5

Para complementar a punto de obtener más información sobre una vista específica

Incluso con las dos respuestas válidas

SHOW FULL TABLES IN your_db_name WHERE TABLE_TYPE LIKE 'VIEW';

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.TABLES 
WHERE TABLE_TYPE LIKE 'VIEW' AND TABLE_SCHEMA LIKE 'your_db_name';

Puede aplicar lo siguiente (creo que es mejor):

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.VIEWS 
WHERE TABLE_SCHEMA LIKE 'your_db_name';

es mejor trabajar directamente con information_schema.VIEWS(observe que ahora es VIEWS y ya no TABLES ), por lo tanto, puede recuperar más datos, use DESC VIEWSpara obtener más detalles:

+----------------------+---------------------------------+------+-----+---------+-------+
| Field                | Type                            | Null | Key | Default | Extra |
+----------------------+---------------------------------+------+-----+---------+-------+
| TABLE_CATALOG        | varchar(64)                     | YES  |     | NULL    |       |
| TABLE_SCHEMA         | varchar(64)                     | YES  |     | NULL    |       |
| TABLE_NAME           | varchar(64)                     | YES  |     | NULL    |       |
| VIEW_DEFINITION      | longtext                        | YES  |     | NULL    |       |
| CHECK_OPTION         | enum('NONE','LOCAL','CASCADED') | YES  |     | NULL    |       |
| IS_UPDATABLE         | enum('NO','YES')                | YES  |     | NULL    |       |
| DEFINER              | varchar(93)                     | YES  |     | NULL    |       |
| SECURITY_TYPE        | varchar(7)                      | YES  |     | NULL    |       |
| CHARACTER_SET_CLIENT | varchar(64)                     | NO   |     | NULL    |       |
| COLLATION_CONNECTION | varchar(64)                     | NO   |     | NULL    |       |
+----------------------+---------------------------------+------+-----+---------+-------+

Por ejemplo, observe el VIEW_DEFINITIONcampo, así puede usarlo en acción:

SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION 
FROM information_schema.VIEWS 
WHERE TABLE_SCHEMA LIKE 'your_db_name';

Por supuesto, tiene más campos disponibles para su consideración.

Manuel Jordan
fuente
2

Intenta mover ese mysql.bakdirectorio fuera de /var/lib/mysqldecir /root/o algo. Parece que mysql está encontrando eso y puede estar causando ese ERROR 1102 (42000): Incorrect database name 'mysql.bak'error.

Bill Rios
fuente
1

El error que ve probablemente se deba a un directorio no creado por MySQL en el directorio de datos de MySQL. MySQL asigna la estructura de la base de datos bastante directamente al sistema de archivos, las bases de datos se asignan a directorios y las tablas son archivos en esos directorios.

El nombre de la base de datos que no funciona parece sospechosamente como si alguien hubiera copiado el directorio de la base de datos mysql en una copia de seguridad en algún momento y lo haya dejado en el directorio de datos de MySQL. Esto no es un problema siempre que no intente usar la base de datos para nada. Desafortunadamente, el esquema de información escanea todas las bases de datos que encuentra y descubre que esta no es una base de datos real y se molesta.

La solución es encontrar el directorio mysql.bak en el disco duro y alejarlo de MySQL.

Martin Hilton
fuente
0

Otra forma de encontrar todas las vistas:

SELECCIONE DISTINCT table_name FROM information_schema.TABLES WHERE table_type = 'VER'

Thanh Nguyen
fuente
0

Si creó una vista en las bases de datos Mysql, simplemente puede verla como ve todas sus tablas en su base de datos particular.

escribir:

--mysql> SHOW TABLES;

verá una lista de tablas y vistas de su base de datos.

Shiv kumar ojha
fuente