รับชื่อตารางโดยใช้คำสั่ง SELECT ใน MySQL


260

ใน MySQL ฉันรู้ว่าฉันสามารถแสดงรายการตารางในฐานข้อมูลด้วย:

SHOW TABLES

อย่างไรก็ตามฉันต้องการแทรกชื่อตารางเหล่านี้ในตารางอื่นตัวอย่างเช่น:

INSERT INTO metadata(table_name) SHOW TABLES /* does not work */

มีวิธีรับชื่อตารางโดยใช้คำสั่ง SELECT มาตรฐานหรือไม่:

INSERT INTO metadata(table_name) SELECT name FROM table_names /* what should table_names be? */

ซ้ำได้ของstackoverflow.com/questions/64894/…
hafichuk

คำตอบ:


381

ในการรับชื่อของตารางทั้งหมดให้ใช้:

SELECT table_name FROM information_schema.tables;

ในการรับชื่อของตารางจากฐานข้อมูลเฉพาะให้ใช้:

SELECT table_name FROM information_schema.tables
WHERE table_schema = 'your_database_name';

ตอนนี้เพื่อตอบคำถามเดิมให้ใช้แบบสอบถามนี้:

INSERT INTO table_name
    SELECT table_name FROM information_schema.tables
        WHERE table_schema = 'your_database_name';

ดูรายละเอียดเพิ่มเติมได้ที่: http://dev.mysql.com/doc/refman/5.0/en/information-schema.html


144

ลอง:

select * from information_schema.tables

ดู: http://dev.mysql.com/doc/refman/5.0/en/information-schema.html


4
สิ่งนี้ชี้ไปในทิศทางที่ถูกต้อง แต่ไม่ได้ตอบคำถามจริงๆ สามารถอธิบายเพิ่มเติมได้อีก
Murilo Garcia

@MuriloGarcia information_schema เป็นส่วนหนึ่งของมาตรฐาน SQL Postgres ก็มีเช่นกัน สำหรับ SQLite คุณดูในsqlite_master
peterchaula

กำลังดึงตารางตามชื่อโดยใช้ LIKE: SELECT TABLE_NAME จาก data_schema.tables WHERE TABLE_NAME เหมือนกับ '% keyword%';
Jarrett Barnett

19

ถ้าเรามีหลายฐานข้อมูลและเราจำเป็นต้องเลือกตารางทั้งหมดสำหรับฐานข้อมูลเฉพาะเราสามารถใช้TABLE_SCHEMAเพื่อกำหนดชื่อฐานข้อมูลเป็น:

select table_name from information_schema.tables where TABLE_SCHEMA='dbname';


12

นอกเหนือจากการใช้ตาราง Information_SCHEMA เพื่อใช้ SHOW TABLES เพื่อแทรกลงในตารางคุณจะต้องใช้สิ่งต่อไปนี้

<?php
 $sql = "SHOW TABLES FROM $dbname";
 $result = mysql_query($sql);
 $arrayCount = 0
 while ($row = mysql_fetch_row($result)) {
  $tableNames[$arrayCount] = $row[0];
  $arrayCount++; //only do this to make sure it starts at index 0
 }
 foreach ($tableNames as &$name {
  $query = "INSERT INTO metadata (table_name) VALUES ('".$name."')";
  mysql_query($query);
 }
?>

8

ลองดูที่ตารางในฐานข้อมูลTABLES information_schemaมันมีข้อมูลเกี่ยวกับตารางในฐานข้อมูลอื่น ๆ ของคุณ แต่ถ้าคุณอยู่ในพื้นที่สาธารณะคุณอาจไม่สามารถเข้าถึงได้



5
SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'DATABASE'

3
ฉันขอให้คุณเพิ่มบริบทเพิ่มเติมในคำตอบของคุณได้ไหม คำตอบแบบรหัสเท่านั้นยากที่จะเข้าใจ มันจะช่วยผู้ถามและผู้อ่านในอนาคตทั้งสองหากคุณสามารถเพิ่มข้อมูลเพิ่มเติมในโพสต์ของคุณ
RBT

4

INFORMATION_SCHEMA.TABLESตารางMySQL มีข้อมูลเกี่ยวกับตารางทั้งสอง (ไม่ใช่ชั่วคราว แต่ถาวร) และมุมมอง คอลัมน์TABLE_TYPEกำหนดว่าจะบันทึกสำหรับตารางหรือมุมมอง (สำหรับตารางTABLE_TYPE='BASE TABLE'และสำหรับมุมมองTABLE_TYPE='VIEW') ดังนั้นหากคุณต้องการดูจากตาราง schema (ฐานข้อมูล) ของคุณมีเพียงแบบสอบถามต่อไปนี้:

SELECT *
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='myschema'

2

ฉันคิดว่าอาจเป็นประโยชน์หากชี้ให้เห็นว่าหากคุณต้องการเลือกตารางที่มีคำเฉพาะคุณสามารถทำได้โดยใช้SELECT(แทนSHOW) ข้อความค้นหาด้านล่างแคบลงการค้นหาไปยังตารางที่มี "คำหลัก" ได้อย่างง่ายดาย

SELECT *
FROM information_schema.tables
WHERE table_name like "%keyword%"

0

ยังมีอีกวิธีที่ง่ายกว่าในการรับชื่อตาราง

SHOW TABLES FROM <database_name>

2
นี่ไม่ได้ตอบคำถามเลย
Mike Chamberlain

ช่วยฉันเมื่อฉันค้นหาสิ่งที่ตรงกับชื่อคำถาม
Shihe Zhang

ไม่มันไม่ดีเท่าที่จะแสดงเฉพาะตารางในเครื่องมือ mysql
TS

0

แบบสอบถามด้านล่างนี้ใช้งานได้สำหรับฉัน สิ่งนี้สามารถแสดงฐานข้อมูลตารางชื่อคอลัมน์ชนิดข้อมูลและจำนวนคอลัมน์ได้

**select table_schema Schema_Name ,table_name TableName,column_name ColumnName,ordinal_position "Position",column_type DataType,COUNT(1) ColumnCount
FROM information_schema.columns
GROUP by table_schema,table_name,column_name,ordinal_position, column_type;**

-3

ในการแทรกอัปเดตและลบให้ทำดังต่อไปนี้:

$teste = array('LOW_PRIORITY', 'DELAYED', 'HIGH_PRIORITY', 'IGNORE', 'INTO', 'INSERT', 'UPDATE', 'DELETE', 'QUICK', 'FROM');
$teste1 = array("\t", "\n", "\r", "\0", "\x0B");
$strsql = trim(str_ireplace($teste1, ' ', str_ireplace($teste, '', $strsql)));
$nomeTabela = substr($strsql, 0, strpos($strsql, ' '));

print($nomeTabela);
exit;

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