จะรับรายการมุมมอง 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'

เหตุใดจึงไม่ทำงาน


ลิงค์นี้อาจช่วยได้
SHASHI SHEKHAR Barnwal

คำตอบ:


291

3
เป็นไปได้ที่จะปล่อย "IN database_name" ออกไปหากคุณมองหามุมมองในฐานข้อมูลที่เลือกในปัจจุบัน
kraftb

เพื่อเสริมหรือดึงข้อมูลเพิ่มเติมเกี่ยวกับมุมมองให้พิจารณา: stackoverflow.com/questions/2834016/…
Manuel Jordan

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/…
Manuel Jordan


7

วิธีนี้จะได้ผล

    USE INFORMATION_SCHEMA;
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    WHERE TABLE_TYPE LIKE 'VIEW';

2
ดีกว่าตรงที่ฉันสามารถปรับแต่งให้ 'แสดงสร้าง' ด้วย concat ได้
Moshe L

1
คำตอบเดียวกันกับValerie Parham-Thompson
Manuel Jordan

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(สังเกตว่าตอนนี้เป็นVIEWSไม่ใช่TABLESอีกต่อไป) ดังนั้นคุณสามารถดึงข้อมูลเพิ่มเติมใช้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

อีกวิธีในการค้นหามุมมองทั้งหมด:

เลือก DISTINCT table_name จาก information_schema แท็บที่ table_type = 'VIEW'


0

หากคุณสร้างมุมมองใด ๆ ในฐานข้อมูล Mysql คุณก็สามารถดูได้ในขณะที่คุณเห็นตารางทั้งหมดของคุณในฐานข้อมูลเฉพาะของคุณ

เขียน:

--mysql> SHOW TABLES;

คุณจะเห็นรายการตารางและมุมมองของฐานข้อมูลของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.