Jak uzyskać listę widoków MySQL?

127

Szukam sposobu na wyświetlenie wszystkich widoków w bazie danych.

Początkowo znalazłem i wypróbowałem odpowiedź na forach MySQL :

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

Jednak to nie zadziała, zwracając pusty zestaw. (Wiem, że tam są!)

Te również zawodzą:

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'

Dlaczego to nie działa?

AnnanFay
źródło
link to może pomóc
SHASHI SHEKHAR Barnwal

Odpowiedzi:

27

Oto sposób na znalezienie wszystkich widoków w każdej bazie danych w Twojej instancji:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.tables 
WHERE TABLE_TYPE LIKE 'VIEW';
Valerie Parham-Thompson
źródło
4
Jeśli chcesz ograniczyć wyszukiwanie do określonej bazy danych, aby uzyskać odpowiedź na zadane pytanie dodaj AND TABLE_SCHEMA LIKE 'database_name'.
Gruber
Aby uzupełnić lub pobrać więcej danych na temat widoku, rozważ: stackoverflow.com/questions/2834016/…
Manuel Jordan
7
 select * FROM information_schema.views\G; 
zloctb
źródło
7

To zadziała.

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';
Sameera Sampath
źródło
2
To jest lepsze, ponieważ mogę nim manipulować, aby „POKAŻ TWORZYĆ” za pomocą concat.
Moshe L
1
Ta sama odpowiedź niżValerie Parham-Thompson
Manuel Jordan
5

Aby uzupełnić, aby uzyskać więcej informacji o określonym widoku

Nawet przy dwóch ważnych odpowiedziach

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

Możesz zastosować następujące (myślę, że jest lepsze):

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

lepiej pracować bezpośrednio z information_schema.VIEWS(obserwuj, że teraz to WIDOK, a nie TABELE ), dzięki czemu możesz pobrać więcej danych, użyj, DESC VIEWSaby uzyskać więcej informacji:

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

Na przykład obserwuj VIEW_DEFINITIONpole, dzięki czemu możesz użyć w akcji:

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

Oczywiście masz więcej pól do rozważenia.

Manuel Jordan
źródło
2

Spróbuj przenieść ten mysql.bakkatalog poza, /var/lib/mysqlaby powiedzieć /root/lub coś. Wygląda na to, że mysql znajduje to i może powodować ten ERROR 1102 (42000): Incorrect database name 'mysql.bak'błąd.

Bill Rios
źródło
1

Błąd, który widzisz, jest prawdopodobnie spowodowany utworzeniem katalogu innego niż MySQL w katalogu danych MySQL. MySQL odwzorowuje strukturę bazy danych bezpośrednio na system plików, bazy danych są mapowane do katalogów, a tabele są plikami w tych katalogach.

Nazwa niedziałającej bazy danych wygląda podejrzanie, jakby ktoś skopiował w pewnym momencie katalog bazy danych mysql do kopii zapasowej i zostawił go w katalogu danych MySQL. Nie stanowi to problemu, o ile nie próbujesz używać bazy danych do niczego. Niestety schemat informacyjny skanuje wszystkie znalezione bazy danych i stwierdza, że ​​ta nie jest prawdziwą bazą danych, i denerwuje się.

Rozwiązaniem jest znalezienie katalogu mysql.bak na dysku twardym i przeniesienie go z dala od MySQL.

Martin Hilton
źródło
0

Inny sposób na znalezienie wszystkich widoków:

SELECT DISTINCT nazwa_tabeli FROM schemat_informacyjny.TABLES WHERE typ_tabeli = 'WIDOK'

Thanh Nguyen
źródło
0

Jeśli utworzyłeś dowolny widok w bazach danych MySQL, możesz go po prostu zobaczyć tak, jak widzisz wszystkie tabele w konkretnej bazie danych.

pisać:

--mysql> SHOW TABLES;

zobaczysz listę tabel i widoków Twojej bazy danych.

Shiv kumar ojha
źródło