簡體   English   中英

MySQL查詢以獲取列名?

[英]MySQL query to get column names?

我想將所有 mysql 表的 col 名稱放入 php 中的數組中?

有這方面的查詢嗎?

最好的方法是使用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表之間區別的更多信息,請查看 關於INFORMATION_SCHEMA的 MySQL 文檔一般...

您可以對 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 參考。

好像有2種方式:

DESCRIBE `tablename`

或者

SHOW COLUMNS FROM `tablename`

更多關於這里的DESCRIBEhttp : //dev.mysql.com/doc/refman/5.0/en/describe.html

我過去曾這樣做過。

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

編輯:今天我學會了更好的方法。 請參閱 ircmaxell 的回答。


解析SHOW COLUMNS FROM table;的輸出SHOW COLUMNS FROM table;

這里有更多關於它的信息: http : //dev.mysql.com/doc/refman/5.0/en/show-columns.html

使用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 起已棄用,將來會被刪除。”

不推薦使用舊的 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; }

當你想用一些文件檢查你的所有表結構時,請使用此代碼。 在此查詢中,我選擇 column_name、column_type 和 table_name 以獲取更多詳細信息。 我按 column_type 使用 order,所以我可以很容易地看到它。

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;

在此處輸入圖片說明

你想檢查更多然后thik鏈接也可以幫助你。

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

所有答案中最簡單的解決方案:

DESC `table name`

或者

DESCRIBE `table name`

或者

SHOW COLUMNS FROM `table name`
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();

不確定這是否是您要找的,但這對我有用:

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

它將表或數組中的列名/變量名作為字符串返回一個簡單的數組,這是我動態構建 MySQL 查詢所需要的。 我的沮喪是我根本不知道如何在 PHP 中很好地索引數組,所以我不確定如何處理 DESC 或 SHOW 的結果。 希望我的回答對像我這樣的初學者有所幫助!

檢查結果: print_r($col_names);

mysql 5.1(不是 5.5)中的SHOW COLUMNS使用臨時磁盤表。

所以在某些情況下它可以被認為是緩慢的。 至少,它可以提高您的created_tmp_disk_tables值。 想象每個連接或每個頁面請求一個臨時磁盤表。

SHOW COLUMNS並不是那么慢,可能是因為它使用了文件系統緩存。 phpmyadmin 一直說 ~0.5ms。 與提供 500ms-1000ms 的 wordpress 頁面相比,這不算什么。 但是,有時還是很重要的。 涉及磁盤系統,您永遠不知道服務器繁忙、緩存已滿、硬盤停止等時會發生什么。

通過SELECT * FROM ... LIMIT 1檢索列名大約是 0.1 毫秒,它也可以使用查詢緩存。

所以這是我從表中獲取列名的小優化代碼,如果可能,不使用顯示列

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_rowsdb_row_ar應替換為您的特定數據庫設置。

在 Wordpress 中:

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

試試這個我個人使用它:

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

如果您使用 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();

這個問題很老,但我在這里尋找一種方法來以動態方式查找給定查詢的字段名稱(不一定只是表的字段)。 而且由於人們一直將其作為其他相關問題中給定任務的答案,因此我將使用 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 模塊,如果需要(刪除數據轉儲部分)。

希望這對其他人有幫助。

此查詢獲取數據庫中所有列的列表,而無需指定表名。 它返回一個只有列名的列表:

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

但是,當我在 phpmyadmin 中運行此查詢時,它顯示了一系列錯誤。 盡管如此,它還是奏效了。 所以請謹慎使用。

如果您只需要字段名稱和類型(也許是為了輕松復制粘貼到 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'

如果你想要所有數據類型

我不是專家,但這對我有用..

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

}

我在 SQL Server 中嘗試過這個查詢,這對我有用:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')

DESCRIBE的調用可以很好地獲取表的所有列,但是如果您需要對其進行過濾,則需要改用SHOW COLUMNS FROM

獲取表的所有信息的 PHP 函數示例:

// get table columns (or return false if table not found)
function get_table_columns($db, $table) {
    
    global $pdo;

    if($cols = $pdo->query("DESCRIBE `$db`.`$table`")) {
        if($cols = $cols->fetchAll(PDO::FETCH_ASSOC)) {
            return $cols;
        }
    }
    
    return false;
}

就我而言,我必須找到 table 的主鍵 所以,我用過:

SHOW COLUMNS FROM `table` WHERE `Key`='PRI';

這是我的 PHP 函數:

// get table Primary Key
function get_table_pk($db, $table) {

    global $pdo;
            
    $q = "SHOW COLUMNS FROM `$db`.`$table` WHERE `Key` = 'PRI'";
    if($cols = $pdo->query($q)) {
        if($cols = $cols->fetchAll(PDO::FETCH_ASSOC)) {
            return $cols[0];
        }
    }
    
    return false;
}

如果你想將它們用於插入語句會生成一個字符串:

    SELECT CONCAT('(',GROUP_CONCAT(`COLUMN_NAME`),')') 
    FROM `INFORMATION_SCHEMA`.`COLUMNS` 
    WHERE `TABLE_SCHEMA`='database_name' 
    AND `TABLE_NAME`='table_name';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM