列名を取得するMySQLクエリ?


286

mysqlテーブルのすべてのcol名をphpの配列に入れたいですか?

これに対するクエリはありますか?

回答:


512

最善の方法は、INFORMATION_SCHEMAメタデータ仮想データベースを使用することです。具体的には、INFORMATION_SCHEMA.COLUMNSテーブル...

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

それは非常に強力であり、テキストを解析する必要なく大量の情報を提供できます(列のタイプ、列がnull可能かどうか、最大列サイズ、文字セットなど)...

ああ、それSHOW ...は標準SQLです(これはMySQL固有の拡張です)...

テーブルの違いSHOW...と使用の詳細については、一般的なINFORMATION_SCHEMA MySQL ドキュメントをINFORMATION_SCHEMA確認してください...


27
テーブル名を引用するためにこれらの愚かなmysql固有のバックティックを使用しない場合、これは標準SQLのみです。私はそれらを嫌い、それらは私のコードを間違って見えるようにします。
MarkR

17
@MarkR実際に回答を書いたとき、実際にはそれらを含めていませんでした。しかし、それはまるで黒字の壁のように見えました。そこで、構文の強調表示を利用するためにバックティックを追加しました。はい、私もSET @@SESSION.sql_mode = 'ANSI_QUOTES';事前に持っていたかもしれませんが、私は本当にそれが好きではありません。また、識別子の区切りのバックティックについては問題ありません。実際、私はそれらを二重引用符よりも気に入っています(二重引用符を使用するとクエリが間違っているように感じます)...それぞれに対して...
ircmaxell

2
上記の例では、テーブル名を引用する必要はまったくありません。
MarkR

20
@MarkR私はそうではないことを知っています。そのため、私は答えを書いたときに、実際にはそれらを含めなかったと述べました。構文の強調表示を利用するために追加しました...
ircmaxell 2010年

4
InnodDBテーブルでは、information_schemaからの選択が非常に遅くなる可能性があることに注意してください。一部のサーバーでは1分以上
macjohn 2013

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 2014年

より多くのクエリのために配列を保存する方法はありますか?$ row [4]をデータベースで検索して、5番目の列の値を取得しますか?
user3866044 2018


21

私はこれを過去にやったことがあります。

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


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()」は廃止されました。したがって、今日、フィールドの名前を取得する最良の方法は、クエリ「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');

これは、テーブルまたは配列の列名/変数名の単純な配列を文字列として返します。これは、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 2017

3

mysql 5.1(5.5ではない)のSHOW COLUMNSは一時ディスクテーブルを使用します。

したがって、場合によっては遅いと見なすことができます。少なくとも、created_tmp_disk_tablesの値を増やすことができます。接続ごとまたはページ要求ごとに1つの一時ディスクテーブルを想像してください。

SHOW COLUMNSは、おそらくファイルシステムキャッシュを使用しているため、それほど低速ではありません。Phpmyadminは一貫して〜0.5msと言います。これは、500ミリ秒から1000ミリ秒のワードプレスページの配信に比べて何もありません。しかし、それでも重要な場合があります。ディスクシステムの関与があり、サーバーがビジーである、キャッシュがいっぱいである、hddがストールしているなどの場合に何が起こるかは決してわかりません。

SELECT * FROM ... LIMIT 1による列名の取得は約0.1msで、クエリキャッシュも使用できます。

したがって、ここでは、可能な場合はshow columnsを使用せずに、テーブルから列名を取得するための最適化された小さなコードを示します

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()が呼び出されます。
KarlosFontana 2013年

申し訳ありませんが、テキストで説明します。これは架空の関数名であり、データベースクラスまたはセットアップがそのタイプのものに使用するものを表します。
Johan

3

私が個人的に使用している、これを試してみてください:

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

1
列名「stock_id」と「drug_name」のみを選択するのはなぜですか?
フランク・ブライス、

私にとってはうまくいきましたが、「どこに...」というものはありませんでした PDOの場合:$ this-> dbHandle = new PDO(...); $ query = 'SHOW COLUMNS FROM'。$ tableName; $ stmt = $ this-> dbHandle-> query($ query); $ results = $ stmt-> fetchAll(PDO :: FETCH_ASSOC); foreach($ results as $ result){//各$ resultで何かを行う}
Zaphoid

2

ワードプレスで:

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を使用している場合は、この要点を使用してください

結果のない選択フィールドの完全な情報と、次のようなすべてのカスタムフィールドを取得できます。

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

上記のsqlがデータを返さない場合、フィールド名aname、bname、bの他のフィールド名も取得します

たった2行:

$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.