कॉलम नाम पाने के लिए MySQL क्वेरी?


286

मैं mysql तालिका के सभी नामों को php में एक सरणी में लाना चाहता हूं?

क्या इसके लिए कोई क्वेरी है?

जवाबों:


512

INFORMATION_SCHEMA मेटाडेटा वर्चुअल डेटाबेस का उपयोग करने का सबसे अच्छा तरीका है । विशेष रूप से INFORMATION_SCHEMA.COLUMNS तालिका ...

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

यह बहुत शक्तिशाली है, और आपको पाठ को पार्स करने की आवश्यकता के बिना जानकारी दे सकता है (जैसे स्तंभ प्रकार, चाहे स्तंभ अशक्त हो, अधिकतम स्तंभ आकार, वर्ण सेट, आदि ...)

ओह, और यह मानक एसक्यूएल (जबकि SHOW ...एक MySQL विशिष्ट विस्तार है) ...

तालिकाओं के बीच अंतर SHOW...और उपयोग करने के बारे में अधिक जानकारी के लिए INFORMATION_SCHEMA, सामान्य रूप से MySQL दस्तावेज़ीकरण देखेंINFORMATION_SCHEMA ...


27
यह केवल मानक एसक्यूएल है यदि आप तालिका के नामों को उद्धृत करने के लिए उन मूर्ख mysql-विशिष्ट backticks का उपयोग नहीं करते हैं। मैं उनसे नफरत करता हूं, वे मेरे कोड को गलत बनाते हैं।
मार्क

17
जब मैंने जवाब लिखा था @MarkR मैंने वास्तव में उन्हें मूल रूप से शामिल नहीं किया था। लेकिन तब यह सिर्फ काले लेखन की दीवार की तरह दिखता था। इसलिए मैंने सिंटैक्स हाइलाइटिंग का लाभ उठाने के लिए बैक-टिक्स को जोड़ा। हाँ, मैं SET @@SESSION.sql_mode = 'ANSI_QUOTES';हाथ से पहले भी हो सकता है , लेकिन मैं वास्तव में ऐसा नहीं है। और पहचानकर्ता परिसीमन के लिए मेरे पास कोई समस्या नहीं है। वास्तव में, मैं उन्हें दोहरे उद्धरण चिह्नों से बेहतर पसंद करता हूं (दोहरे उद्धरण मुझे प्रश्न गलत लगता है) ... प्रत्येक को अपने स्वयं के ...
ircmaxell

2
उपर्युक्त उदाहरण में तालिका नामों का हवाला देना आवश्यक नहीं है।
16

20
@MarkR मुझे पता है कि यह नहीं है। इसलिए मैंने कहा कि जब मैंने उत्तर लिखा था तो मैंने उन्हें मूल रूप से शामिल नहीं किया था । मैंने उन्हें सिंटेक्स हाइलाइटिंग का लाभ उठाने के लिए जोड़ा ...
ircmaxell

4
ध्यान रखें कि InnodDB तालिकाओं से सूचना से चयन किया जा सकता है_श्रेमा बहुत दर्दनाक रूप से धीमी हो सकती है। कुछ सर्वरों में एक मिनट से अधिक
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

क्या अधिक प्रश्नों के लिए सरणी को सहेजने का कोई तरीका है? पांचवें कॉलम में मूल्य प्राप्त करने के लिए $ पंक्ति [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
असली सपने

7
और DESCभी कम हाथ के लिए है DESCRIBE!
ब्रेट विडमियर

21

मैंने अतीत में ऐसा किया है।

SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here'; 

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()अद्यतित विधियाँ हैं
गुस्तावस्तव गिल

5

एक पुराने PHP फ़ंक्शन "mysql_list_fields ()" को हटा दिया गया है। इसलिए, आज खेतों का नाम पाने का सबसे अच्छा तरीका एक क्वेरी "SHOW COLUMNS FROM 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');

यह तार तालिका के रूप में स्तंभ नामों / चर नामों का एक सरल सरणी देता है या तार के रूप में सरणी, जो कि मुझे गतिशील रूप से नए SQL क्वेरी बनाने की आवश्यकता है। मेरी हताशा यह थी कि मुझे नहीं पता कि 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;

यहां छवि विवरण दर्ज करें

यदि आप जांचना चाहते हैं कि कौन सा फ़ील्ड अशक्त प्रकार की अनुमति देता है तो आप इसका उपयोग कर सकते हैं

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;

यहां छवि विवरण दर्ज करें

आप अधिक जाँच करना चाहते हैं तो थिक लिंक भी आपकी मदद करता है।

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


अच्छा। बहुत मददगार।
सज्जाद हिसैन खान

3

Mysql 5.1 (5.5 नहीं) में SHOW COLUMNS एक अस्थायी डिस्क तालिका का उपयोग करता है।

इसलिए इसे कुछ मामलों के लिए धीमा माना जा सकता है। कम से कम, यह आपके बनाए गए_tmp_disk_tables मान को टक्कर दे सकता है । प्रति कनेक्शन या प्रत्येक पृष्ठ अनुरोध के अनुसार एक अस्थायी डिस्क तालिका की कल्पना करें।

शो कॉम्स वास्तव में इतनी धीमी नहीं है, संभवतः क्योंकि यह फ़ाइल सिस्टम कैश का उपयोग करता है। फपीमेडमिन कहते हैं ~ 0.5ms लगातार। यह 500ms-1000ms की तुलना में एक WordPress पृष्ठ की सेवा करने के लिए कुछ भी नहीं है। लेकिन फिर भी, कई बार यह मायने रखता है। एक डिस्क सिस्टम की भागीदारी है, आप कभी नहीं जानते कि सर्वर व्यस्त होने पर क्या होता है, कैश भरा हुआ है, एचडीडी स्टाल्ड है आदि।

सेलेक्ट कॉलम के नामों को SELECT * FROM ... लिमिट 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 को आपके विशिष्ट डेटाबेस सेटअप के साथ प्रतिस्थापित किया जाना चाहिए।

हाय जोहान, मुझे त्रुटि मिलती है: जब मैं db_columns_ar ('myTableName') चलाता हूं, तो अपरिभाषित फ़ंक्शन db_row_ar () पर कॉल करें;
करलोसफोंटाना

इसके लिए क्षमा करें, मैं इसे पाठ में स्पष्ट करूंगा। यह एक काल्पनिक फ़ंक्शन नाम था, जो उस प्रकार की चीज़ के लिए आपके डेटाबेस वर्ग या सेटअप का उपयोग करता है।
जोहान

3

व्यक्तिगत रूप से इसका उपयोग करने की कोशिश करें:

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

1
आप केवल कॉलम नाम "स्टॉक_ड" और "ड्रग_नाम" का चयन क्यों कर रहे हैं?
फ्रैंक ब्रायस

मेरे लिए काम किया लेकिन "कहाँ ..." सामान के बिना। PDO के साथ: $ यह-> dHHandle = नया PDO (...); $ क्वेरी = 'SHOW COLUMNS FROM'। $ TableName; $ stmt = $ this-> dbHandle-> क्वेरी ($ क्वेरी); $ परिणाम = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ परिणाम के रूप में परिणाम) {// प्रत्येक $ परिणाम के साथ कुछ करें}
ज़ाफॉइड

2

स्रोत:

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

2

यह प्रश्न पुराना है, लेकिन मैं यहां दिए गए क्वेरी को एक गतिशील तरीके से अपने फ़ील्ड नामों को खोजने का तरीका ढूंढ रहा था (जरूरी नहीं कि केवल एक तालिका के क्षेत्र)। और जब से लोग इसे अन्य संबंधित प्रश्नों में उस दिए गए कार्य के उत्तर के रूप में इंगित करते रहते हैं, मैं जिस तरह से यह पाया जा सकता है उसे साझा कर रहा हूं, गैविन सिम्पसन के सुझावों का उपयोग कर रहा हूं:

//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>";
    }
}

यह आसानी से एक सरणी में फ़ील्ड नाम सम्मिलित करने के लिए modded किया जा सकता है।

एक सरल का उपयोग करना: यदि आवश्यक हो (डेटा डंप भाग को हटाने) $sql="SELECT * FROM myTable LIMIT 1"का उपयोग करने SHOW COLUMNSया किसी भी अतिरिक्त php मॉड्यूल की आवश्यकता के बिना, आप किसी भी तालिका के क्षेत्र दे सकते हैं ।

उम्मीद है कि यह किसी और की मदद करता है।


2

यदि आप php का उपयोग करते हैं, तो इस gist का उपयोग करें ।

यह बिना किसी परिणाम , और सभी कस्टम फ़ील्ड जैसे पूर्ण फ़ील्ड का चयन कर सकते हैं:

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

यदि sql के ऊपर कोई डेटा नहीं लौटता है, तो फ़ील्ड नाम aname, 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

यदि आपको केवल फ़ील्ड नाम और प्रकार की आवश्यकता है (शायद एक्सेल में आसान कॉपी-पेस्टिंग के लिए):

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 सर्वर में इस क्वेरी की कोशिश की है और इसने मेरे लिए काम किया है:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.