Comment obtenir une liste des vues MySQL?

127

Je cherche un moyen de lister toutes les vues dans une base de données.

Au départ, j'ai trouvé et essayé une réponse sur les forums MySQL :

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

Cependant, cela ne fonctionne pas, renvoyer un ensemble vide. (Je sais qu'ils sont là-dedans!)

Ceux-ci échouent également:

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'

Pourquoi ça ne marche pas?

AnnanFay
la source
lien cela peut aider
SHASHI SHEKHAR Barnwal

Réponses:

27

Voici un moyen de trouver toutes les vues dans chaque base de données de votre instance:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.tables 
WHERE TABLE_TYPE LIKE 'VIEW';
Valérie Parham-Thompson
la source
4
Si vous souhaitez restreindre la recherche à une certaine base de données pour obtenir une réponse à la question posée, ajoutez AND TABLE_SCHEMA LIKE 'database_name'.
Gruber
Pour compléter ou récupérer plus de données sur la vue, considérez: stackoverflow.com/questions/2834016/…
Manuel Jordan
7
 select * FROM information_schema.views\G; 
zloctb
la source
7

Cela fonctionnera.

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';
Sameera Sampath
la source
2
C'est mieux, car je peux le manipuler pour «SHOW CREATE» avec concat.
Moshe L
1
Même réponse queValerie Parham-Thompson
Manuel Jordan
5

Pour compléter sur pour obtenir plus d'informations sur une vue spécifique

Même avec les deux réponses valides

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';

Vous pouvez appliquer ce qui suit (je pense que c'est mieux):

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

Il est préférable de travailler directement avec information_schema.VIEWS(observez maintenant VIEWS et non plus TABLES ), ainsi vous pouvez récupérer plus de données, utilisez DESC VIEWSpour plus de détails:

+----------------------+---------------------------------+------+-----+---------+-------+
| 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    |       |
+----------------------+---------------------------------+------+-----+---------+-------+

Par exemple, observez le VIEW_DEFINITIONchamp, vous pouvez donc utiliser en action:

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

Bien sûr, vous avez plus de champs disponibles pour votre considération.

Manuel Jordan
la source
2

Essayez de déplacer ce mysql.bakrépertoire /var/lib/mysqlpour dire /root/ou quelque chose. Il semble que mysql trouve cela et cela peut être à l'origine de cette ERROR 1102 (42000): Incorrect database name 'mysql.bak'erreur.

Bill Rios
la source
1

L'erreur que vous voyez est probablement due à un répertoire créé non-MySQL dans le répertoire de données de MySQL. MySQL mappe la structure de la base de données assez directement sur le système de fichiers, les bases de données sont mappées sur des répertoires et les tables sont des fichiers dans ces répertoires.

Le nom de la base de données qui ne fonctionne pas ressemble étrangement à ce que quelqu'un a copié le répertoire de la base de données mysql dans une sauvegarde à un moment donné et l'a laissé dans le répertoire de données de MySQL. Ce n'est pas un problème tant que vous n'essayez pas d'utiliser la base de données pour quoi que ce soit. Malheureusement, le schéma d'information analyse toutes les bases de données qu'il trouve et constate que celle-ci n'est pas une véritable base de données et s'énerve.

La solution est de trouver le répertoire mysql.bak sur le disque dur et de l'éloigner de MySQL.

Martin Hilton
la source
0

Une autre façon de trouver toutes les vues:

SELECT DISTINCT nom_table FROM schéma_information.TABLES WHERE type_table = 'VIEW'

Thanh Nguyen
la source
0

Si vous avez créé une vue dans les bases de données Mysql, vous pouvez simplement la voir comme vous voyez toutes vos tables dans votre base de données particulière.

écrire:

--mysql> SHOW TABLES;

vous verrez la liste des tables et des vues de votre base de données.

Shiv kumar ojha
la source