Bagaimana cara mendapatkan daftar tampilan MySQL?

127

Saya mencari cara untuk membuat daftar semua tampilan dalam database.

Awalnya saya menemukan dan mencoba jawaban di forum MySQL :

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

Bagaimana pun ini tidak berhasil, mengembalikan set kosong. (Aku tahu mereka ada di sana!)

Ini juga gagal:

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'

Mengapa ini tidak berhasil?

AnnanFay
sumber
tautan ini mungkin membantu
SHASHI SHEKHAR Barnwal

Jawaban:

27

Berikut adalah cara untuk menemukan semua tampilan di setiap basis data atas contoh Anda:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM information_schema.tables 
WHERE TABLE_TYPE LIKE 'VIEW';
Valerie Parham-Thompson
sumber
4
Jika Anda ingin membatasi pencarian ke database tertentu untuk mendapatkan jawaban atas pertanyaan yang diajukan tambahkan AND TABLE_SCHEMA LIKE 'database_name'.
Gruber
Untuk melengkapi atau mengambil lebih banyak data tentang tampilan pertimbangkan: stackoverflow.com/questions/2834016/…
Manuel Jordan
7
 select * FROM information_schema.views\G; 
zloctb
sumber
7

Ini akan bekerja

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';
Sameera Sampath
sumber
2
Ini lebih baik, karena saya bisa memanipulasinya menjadi 'SHOW CREATE' dengan concat.
Moshe L
1
Jawaban yang sama dariValerie Parham-Thompson
Manuel Jordan
5

Untuk melengkapi tentang mendapatkan info lebih lanjut tentang tampilan tertentu

Bahkan dengan dua jawaban yang valid

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

Anda dapat menerapkan hal berikut (saya pikir lebih baik):

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

lebih baik bekerja secara langsung dengan information_schema.VIEWS(amati sekarang adalah VIEWS dan bukan TABLES lagi), sehingga Anda dapat mengambil lebih banyak data, gunakan DESC VIEWSuntuk rincian lebih lanjut:

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

Misalnya amati VIEW_DEFINITIONbidangnya, sehingga Anda dapat menggunakannya dalam aksi:

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

Tentu saja Anda memiliki lebih banyak bidang yang tersedia untuk pertimbangan Anda.

Manuel Jordan
sumber
2

Coba pindahkan mysql.bakdirektori itu /var/lib/mysqluntuk mengatakan /root/sesuatu. Sepertinya mysql menemukan itu dan mungkin menyebabkan ERROR 1102 (42000): Incorrect database name 'mysql.bak'kesalahan itu.

Bill Rios
sumber
1

Kesalahan yang Anda lihat mungkin disebabkan oleh direktori yang dibuat non-MySQL di direktori data MySQL. MySQL memetakan struktur basis data secara langsung ke sistem file, basis data dipetakan ke direktori dan tabel adalah file dalam direktori tersebut.

Nama database yang tidak berfungsi terlihat mencurigakan seperti seseorang telah menyalin direktori database mysql ke cadangan di beberapa titik dan meninggalkannya di direktori data MySQL. Ini bukan masalah selama Anda tidak mencoba dan menggunakan database untuk apa pun. Sayangnya skema informasi memindai semua database yang ditemukan dan menemukan bahwa ini bukan database nyata dan menjadi marah.

Solusinya adalah menemukan direktori mysql.bak di hard disk dan memindahkannya menjauh dari MySQL.

Martin Hilton
sumber
0

Cara lain untuk menemukan semua Tampilan:

SELECT DISTINCT table_name FROM information_schema.TABLES WHERE table_type = 'LIHAT

Thanh Nguyen
sumber
0

Jika Anda membuat tampilan apa pun di basis data Mysql maka Anda bisa melihatnya saat Anda melihat semua tabel di basis data Anda.

menulis:

--mysql> SHOW TABLES;

Anda akan melihat daftar tabel dan tampilan database Anda.

Shiv kumar ojha
sumber