Как получить список представлений MySQL?

127

Я ищу способ перечислить все представления в базе данных.

Сначала я нашел и попробовал ответ на форумах MySQL :

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

Как бы то ни было, это не работает, возвращая пустой набор. (Я знаю, что они там!)

Они также терпят неудачу:

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'

Почему это не работает?

AnnanFay
источник
ссылка может помочь
ШАШИ ШЕХАР Барнвал

Ответы:

291
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

Запрос MySQL для поиска всех представлений в базе данных


источник
3
Можно не указывать "IN database_name", если вы ищете представление в выбранной в данный момент БД.
kraftb 02
Чтобы дополнить или получить больше данных о представлении, рассмотрите: stackoverflow.com/questions/2834016/…
Мануэль Джордан
27

Вот способ найти все представления в каждой базе данных вашего экземпляра:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.tables 
WHERE TABLE_TYPE LIKE 'VIEW';
Валери Пархэм-Томпсон
источник
4
Если вы хотите ограничить поиск определенной базой данных, чтобы получить ответ на поставленный вопрос, добавьте AND TABLE_SCHEMA LIKE 'database_name'.
Gruber
Чтобы дополнить или получить больше данных о представлении, рассмотрите: stackoverflow.com/questions/2834016/…
Мануэль Джордан
7

Это сработает.

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';
Самира Сампатх
источник
2
Это лучше, так как я могу управлять им, чтобы «ПОКАЗАТЬ СОЗДАТЬ» с помощью concat.
Моше Л.
1
Тот же ответ, чемValerie Parham-Thompson
Мануэль Джордан
5

В дополнение, чтобы получить дополнительную информацию о конкретном представлении

Даже с двумя действительными ответами

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

Можно применить следующее (думаю, лучше):

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

лучше работать напрямую information_schema.VIEWS(обратите внимание, что теперь это ВИДЫ, а не ТАБЛИЦЫ ), поэтому вы можете получить больше данных, используйте DESC VIEWSдля более подробной информации:

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

Например, наблюдая за VIEW_DEFINITIONполем, вы можете использовать в действии:

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

Конечно, у вас есть больше полей для вашего рассмотрения.

Мануэль Джордан
источник
2

Попробуйте переместить этот mysql.bakкаталог, /var/lib/mysqlчтобы сказать /root/или что-то в этом роде. Кажется, что mysql обнаруживает это и может вызывать эту ERROR 1102 (42000): Incorrect database name 'mysql.bak'ошибку.

Билл Риос
источник
1

Ошибка, которую вы видите, вероятно, связана с созданием каталога, отличного от MySQL, в каталоге данных MySQL. MySQL отображает структуру базы данных непосредственно в файловой системе, базы данных отображаются в каталоги, а таблицы - это файлы в этих каталогах.

Имя нерабочей базы данных выглядит подозрительно, как будто кто-то скопировал каталог базы данных mysql в резервную копию в какой-то момент и оставил ее в каталоге данных MySQL. Это не проблема, пока вы не пытаетесь использовать базу данных ни для чего. К сожалению, информационная схема сканирует все найденные базы данных и обнаруживает, что это не настоящая база данных, и расстраивается.

Решение состоит в том, чтобы найти каталог mysql.bak на жестком диске и переместить его подальше от MySQL.

Мартин Хилтон
источник
0

Другой способ найти все View:

ВЫБЕРИТЕ DISTINCT имя_таблицы ИЗ information_schema.TABLES WHERE table_type = 'VIEW'

Тхань Нгуен
источник
0

Если вы создали какое-либо представление в базах данных Mysql, вы можете просто увидеть его, как вы видите все свои таблицы в своей конкретной базе данных.

записывать:

--mysql> SHOW TABLES;

вы увидите список таблиц и представлений вашей базы данных.

Шив Кумар Оджха
источник