แบบสอบถาม MySQL เพื่อรับชื่อคอลัมน์?


286

ฉันต้องการให้ชื่อคอลัมน์ของตาราง mysql ทั้งหมดเป็นอาร์เรย์ใน php หรือไม่

มีคำถามสำหรับสิ่งนี้หรือไม่?

คำตอบ:


513

วิธีที่ดีที่สุดคือใช้ฐานข้อมูลเสมือน metadata ของInformation_SCHEMA เฉพาะตารางInformation_SCHEMA.COLUMNS ...

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

มันมีประสิทธิภาพมากและสามารถให้ข้อมูลมากมายโดยไม่จำเป็นต้องแยกวิเคราะห์ข้อความ (เช่นประเภทคอลัมน์ไม่ว่าคอลัมน์จะเป็นโมฆะขนาดคอลัมน์สูงสุดชุดอักขระ ฯลฯ ) ...

โอ้และเป็นมาตรฐาน SQL (ในขณะที่ SHOW ...เป็นส่วนขยายเฉพาะ MySQL) ...

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างSHOW...และการใช้INFORMATION_SCHEMAตารางตรวจสอบ MySQL เอกสารINFORMATION_SCHEMAในทั่วไป ...


27
เป็น SQL มาตรฐานเท่านั้นหากคุณไม่ใช้ backticks เฉพาะ mysql ที่โง่เพื่ออ้างชื่อตาราง ฉันเกลียดพวกเขาพวกเขาทำให้รหัสของฉันผิด
MarkR

17
@ MarkR ฉันไม่ได้รวมไว้ในตอนแรกเมื่อฉันเขียนคำตอบ แต่มันก็ดูเหมือนกำแพงเขียนสีดำ ดังนั้นฉันจึงเพิ่มเครื่องหมายขีดย้อนกลับเพื่อใช้ประโยชน์จากการเน้นไวยากรณ์ ใช่ฉันสามารถมีSET @@SESSION.sql_mode = 'ANSI_QUOTES';มือก่อนหน้าได้เช่นกัน แต่ฉันไม่ชอบมัน และฉันก็ไม่มีปัญหากับ back-ticks สำหรับการกำหนดตัวคั่น ในความเป็นจริงฉันชอบพวกเขาดีกว่าอัญประกาศคู่ (อัญประกาศคู่ทำให้แบบสอบถามรู้สึกผิดกับฉัน) ... สำหรับแต่ละคนของพวกเขา ...
ircmaxell

2
การอ้างอิงชื่อตารางนั้นไม่จำเป็นในตัวอย่างข้างต้น
MarkR

20
@ MarkR ฉันรู้ว่ามันไม่ใช่ นั่นเป็นเหตุผลที่ผมบอกว่าที่จริงผมไม่ได้รวมไว้เดิมเมื่อผมเขียนคำตอบ ฉันเพิ่มพวกเขาเพื่อใช้ประโยชน์จากการเน้นไวยากรณ์ ...
ircmaxell

4
ระวังด้วยตาราง InnodDB ที่เลือกจาก information_schema อาจทำให้เกิดความเจ็บปวดได้ช้ามาก ในบางเซิร์ฟเวอร์มากกว่าหนึ่งนาที
macjohn

206

คุณสามารถใช้แบบสอบถามต่อไปนี้สำหรับ MySQL:

SHOW columns FROM your-table;

ด้านล่างเป็นตัวอย่างรหัสที่แสดงวิธีการใช้งานด้านบนไวยากรณ์ใน php เพื่อแสดงชื่อของคอลัมน์:

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."<br>";
}

สำหรับรายละเอียดเกี่ยวกับผลลัพธ์ของการSHOW COLUMNS FROM TABLEเข้าชม: MySQL Refrence


5
หรือ ... DESC TableName;;-)
double_j

มีวิธีการบันทึกอาร์เรย์สำหรับแบบสอบถามเพิ่มเติมหรือไม่ ต้องการค้นหาฐานข้อมูลสำหรับ $ row [4] เพื่อรับค่าในคอลัมน์ที่ห้าหรือไม่
user3866044

43

ดูเหมือนว่ามี 2 วิธี:

DESCRIBE `tablename`

หรือ

SHOW COLUMNS FROM `tablename`

เพิ่มเติมเกี่ยวกับDESCRIBEที่นี่: http://dev.mysql.com/doc/refman/5.0/en/describe.html


4
อ่าเป็นเพียงทางลัดสำหรับDESCRIBE SHOW COLUMNS FROM
Surreal Dreams

7
และDESCเป็นมือที่สั้นกว่าสำหรับDESCRIBE!
Brett Widmeier


14

แก้ไข : วันนี้ฉันเรียนรู้วิธีที่ดีกว่าในการทำสิ่งนี้ โปรดดูคำตอบของ ircmaxell


แยกวิเคราะห์ผลลัพธ์ของ SHOW COLUMNS FROM table;

นี่คือเพิ่มเติมเกี่ยวกับที่นี่: http://dev.mysql.com/doc/refman/5.0/en/show-columns.html


7

ใช้mysql_fetch_field()เพื่อดูข้อมูลคอลัมน์ทั้งหมด ดูคู่มือ

$query = 'select * from myfield';
$result = mysql_query($query);
$i = 0;
while ($i < mysql_num_fields($result))
{
   $fld = mysql_fetch_field($result, $i);
   $myarray[]=$fld->name;
   $i = $i + 1;
}

"คำเตือนส่วนขยายนี้เลิกใช้ตั้งแต่ PHP 5.5.0 และจะถูกลบออกในอนาคต"


2
mysqli_num_fields()และmysqli_fetch_field_direct()เป็นวิธีการอัพเดท
Gusstavv Gil

5

ฟังก์ชัน PHP เก่า "mysql_list_fields ()" เลิกใช้แล้ว ดังนั้นวันนี้วิธีที่ดีที่สุดในการรับชื่อเขตข้อมูลคือข้อความค้นหา "แสดงคอลัมน์จาก table_name [LIKE 'name']" ดังนั้นนี่คือตัวอย่างเล็ก ๆ น้อย ๆ :

$fields = array();
$res=mysql_query("SHOW COLUMNS FROM mytable");
while ($x = mysql_fetch_assoc($res)){
  $fields[] = $x['Field'];
}
foreach ($fields as $f) { echo "<br>Field name: ".$f; }

4
function get_col_names(){  
    $sql = "SHOW COLUMNS FROM tableName";  
    $result = mysql_query($sql);     
    while($record = mysql_fetch_array($result)){  
     $fields[] = $record['0'];  
    }
    foreach ($fields as $value){  
      echo 'column name is : '.$value.'-';  
}  
 }  

return get_col_names();

4

ไม่แน่ใจว่านี่คือสิ่งที่คุณกำลังมองหาหรือไม่ แต่สิ่งนี้ได้ผลกับฉัน:

$query = query("DESC YourTable");  
$col_names = array_column($query, 'Field');

ที่ส่งกลับอาร์เรย์แบบง่าย ๆ ของชื่อคอลัมน์ / ชื่อตัวแปรในตารางหรืออาร์เรย์ของคุณเป็นสตริงซึ่งเป็นสิ่งที่ฉันต้องการในการสร้างแบบสอบถาม MySQL แบบไดนามิก ความยุ่งยากของฉันคือฉันไม่รู้วิธีทำดัชนีอาร์เรย์ใน PHP เป็นอย่างดีดังนั้นฉันไม่แน่ใจว่าจะทำอย่างไรกับผลลัพธ์จาก DESC หรือ SHOW หวังว่าคำตอบของฉันจะเป็นประโยชน์สำหรับผู้เริ่มต้นเช่นฉัน!

วิธีตรวจสอบผลลัพธ์: print_r($col_names);


4

เมื่อคุณต้องการตรวจสอบโครงสร้างตารางทั้งหมดของคุณด้วยการยื่นบางส่วนจากนั้นใช้รหัสนี้ ในแบบสอบถามนี้ฉันเลือก column_name, column_type และ table_name สำหรับรายละเอียดเพิ่มเติม ฉันใช้คำสั่งซื้อโดย column_type เพื่อให้สามารถดูได้อย่างง่ายดาย

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;

หากคุณต้องการตรวจสอบเพียงประเภทสองประเภทที่ยื่นจากนั้นคุณสามารถทำได้อย่างง่ายดาย

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' AND DATA_TYPE like '%bigint%'  order by DATA_TYPE;

ป้อนคำอธิบายรูปภาพที่นี่

ถ้าคุณต้องการตรวจสอบว่าเขตข้อมูลใดที่อนุญาตให้มีประเภท null และอื่น ๆ คุณสามารถใช้มันได้

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,IS_NULLABLE,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' and DATA_TYPE like '%bigint%' and IS_NULLABLE ='NO' order by COLUMN_TYPE;

ป้อนคำอธิบายรูปภาพที่นี่

คุณต้องการตรวจสอบเพิ่มเติมแล้วลิงค์ thik ยังช่วยคุณ

https://dev.mysql.com/doc/refman/5.7/en/columns-table.html


ดี. มีประโยชน์มาก
Sazzad Hissain Khan

3

SHOW COLUMNSใน mysql 5.1 (ไม่ใช่ 5.5) ใช้ตารางดิสก์ชั่วคราว

ดังนั้นจึงถือได้ว่าช้าในบางกรณี อย่างน้อยก็สามารถชนค่าcreated_tmp_disk_tablesของคุณได้ ลองนึกภาพหนึ่งตารางดิสก์ชั่วคราวต่อการเชื่อมต่อหรือตามคำขอของแต่ละหน้า

แสดงคอลัมน์ไม่ช้ามากอาจเป็นเพราะใช้แคชของระบบไฟล์ Phpmyadmin พูดว่า ~ 0.5ms อย่างสม่ำเสมอ นี่คือไม่มีอะไรเทียบกับ 500ms-1000ms ของการให้บริการหน้า wordpress แต่ก็ยังมีบางครั้งมันเป็นเรื่องสำคัญ มีการมีส่วนร่วมของระบบดิสก์คุณไม่เคยรู้ว่าจะเกิดอะไรขึ้นเมื่อเซิร์ฟเวอร์ไม่ว่างแคชเต็ม HDD อยู่จนครบ ฯลฯ

กำลังเรียกชื่อคอลัมน์ผ่านSELECT * FROM ... LIMIT 1ประมาณ ~ 0.1ms และสามารถใช้คิวแคชได้เช่นกัน

ดังนั้นนี่คือรหัสที่ดีที่สุดของฉันเล็กน้อยเพื่อรับชื่อคอลัมน์จากตารางโดยไม่ต้องใช้คอลัมน์แสดงถ้าเป็นไปได้:

function db_columns_ar($table)
{
//returns Array('col1name'=>'col1name','col2name'=>'col2name',...)
if(!$table) return Array();
if(!is_string($table)) return Array();

global $db_columns_ar_cache;
if(!empty($db_columns_ar_cache[$table]))
    return $db_columns_ar_cache[$table];


//IMPORTANT show columns creates a temp disk table
$cols=Array();
$row=db_row_ar($q1="SELECT * FROM `$table` LIMIT 1");
if($row)
    {
    foreach($row as $name=>$val)
        $cols[$name]=$name;
    }
else
    {
    $coldata=db_rows($q2="SHOW COLUMNS FROM `$table`");
    if($coldata)
        foreach($coldata as $row)
            $cols[$row->Field]=$row->Field;
    }
$db_columns_ar_cache[$table]=$cols;
//debugexit($q1,$q2,$row,$coldata,$cols);
return $cols;
}

หมายเหตุ:

  • ตราบใดที่ตารางของคุณแถวแรกไม่มีข้อมูลในช่วงเมกะไบต์ควรทำงานได้ดี
  • ชื่อฟังก์ชันdb_rowsและdb_row_arควรถูกแทนที่ด้วยการตั้งค่าฐานข้อมูลเฉพาะของคุณ

สวัสดี Johan ฉันได้รับข้อผิดพลาด: Call to undefined function db_row_ar () เมื่อฉันรัน db_columns_ar ('myTableName');
KarlosFontana

ขออภัยที่ฉันจะชี้แจงในข้อความ นั่นคือชื่อฟังก์ชั่นจินตภาพโดยย่อมาจากคลาสฐานข้อมูลหรือการตั้งค่าของคุณที่ใช้กับสิ่งนั้น
Johan

3

ลองใช้ตัวนี้ฉันใช้เอง:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 

1
ทำไมคุณถึงเลือกเฉพาะชื่อคอลัมน์ "stock_id" และ "drug_name"
Frank Bryce

ทำงานสำหรับฉัน แต่ไม่มีสิ่ง "ที่ ... " ด้วย PDO: $ this-> dbHandle = new PDO (... ); $ query = 'SHOW COLUMNS FROM' $ tableName; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach (ผลลัพธ์ $ เป็นผลลัพธ์ $) {// ทำบางสิ่งกับผลลัพธ์ $ $}
Zaphoid

2

ใน WORDPRESS:

global $wpdb;   $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
  var_dump( $column_name );
}

2

คำถามนี้เก่า แต่ฉันมาที่นี่เพื่อค้นหาวิธีค้นหาข้อความค้นหาที่ระบุในชื่อแบบไดนามิก (ไม่ใช่เฉพาะฟิลด์ของตาราง) และเนื่องจากผู้คนชี้ให้เห็นว่านี่เป็นคำตอบสำหรับงานที่มอบหมายในคำถามที่เกี่ยวข้องอื่น ๆ ฉันแบ่งปันวิธีที่ฉันพบว่าทำได้โดยใช้เคล็ดลับของ Gavin Simpson:

//Function to generate a HTML table from a SQL query
function myTable($obConn,$sql)
{
    $rsResult = mysqli_query($obConn, $sql) or die(mysqli_error($obConn));
    if(mysqli_num_rows($rsResult)>0)
    {
        //We start with header. >>>Here we retrieve the field names<<<
        echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\"><tr align=\"center\" bgcolor=\"#CCCCCC\">";
        $i = 0;
        while ($i < mysqli_num_fields($rsResult)){
           $field = mysqli_fetch_field_direct($rsResult, $i);
           $fieldName=$field->name;
           echo "<td><strong>$fieldName</strong></td>";
           $i = $i + 1;
        }
        echo "</tr>"; 
        //>>>Field names retrieved<<<

        //We dump info
        $bolWhite=true;
        while ($row = mysqli_fetch_assoc($rsResult)) {
            echo $bolWhite ? "<tr bgcolor=\"#CCCCCC\">" : "<tr bgcolor=\"#FFF\">";
            $bolWhite=!$bolWhite;
            foreach($row as $data) {
                echo "<td>$data</td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
}

สามารถปรับเปลี่ยนชื่อฟิลด์ในอาเรย์ได้อย่างง่ายดาย

การใช้ง่าย: $sql="SELECT * FROM myTable LIMIT 1"สามารถให้ฟิลด์ของตารางใด ๆ แก่คุณโดยไม่จำเป็นต้องใช้SHOW COLUMNSหรือโมดูล php พิเศษใด ๆ หากจำเป็น (ลบส่วนการถ่ายโอนข้อมูล)

หวังว่านี่จะช่วยคนอื่นได้


2

ถ้าคุณใช้ PHP ให้ใช้ส่วนสำคัญนี้

สามารถรับข้อมูลเต็มฟิลด์ที่เลือกโดยไม่มีผลลัพธ์ fields และฟิลด์ที่กำหนดเองทั้งหมดเช่น:

SELECT a.name aname, b.name bname, b.* 
FROM table1 a LEFT JOIN table2 b
ON a.id = b.pid;

ถ้าด้านบน sql ไม่ส่งคืนข้อมูลจะได้รับชื่อฟิลด์ชื่อ, bname, ชื่อเขตข้อมูลอื่นของ b

แค่สองบรรทัด:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();

2

แบบสอบถามนี้ดึงรายการของคอลัมน์ทั้งหมดในฐานข้อมูลโดยไม่ต้องระบุชื่อตาราง จะส่งคืนรายการชื่อคอลัมน์เท่านั้น:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema = 'db_name'

อย่างไรก็ตามเมื่อฉันรันเคียวรีนี้ใน phpmyadmin มันจะแสดงชุดข้อผิดพลาด อย่างไรก็ตามมันใช้งานได้ ดังนั้นใช้ด้วยความระมัดระวัง


2

ทางออกที่ง่ายที่สุดจากคำตอบทั้งหมด:

DESC `table name`

หรือ

DESCRIBE `table name`

หรือ

SHOW COLUMNS FROM `table name`

2

หากคุณต้องการชื่อฟิลด์และประเภท (อาจจะง่ายต่อการคัดลอกลงใน Excel):

SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'

ลบ

DATA_TYPE='decimal'

ถ้าคุณต้องการชนิดข้อมูลทั้งหมด


1

ฉันไม่มีความเชี่ยวชาญ แต่สิ่งนี้ใช้ได้ผลสำหรับฉัน ..

$sql = "desc MyTable";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>"; // returns the first column of array. in this case Field

      // the below code will return a full array-> Field,Type,Null,Key,Default,Extra    
      // for ($c=0;$c<sizeof($row);$c++){echo @$row[$c]."<br>";}    

}

0

ฉันได้ลองใช้แบบสอบถามนี้ใน SQL Server และทำงานให้ฉัน:

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