Obter nomes de colunas da tabela no MySQL?

301

Existe uma maneira de pegar o nome das colunas de uma tabela no mysql? usando php

Um empregado
fonte

Respostas:

537

Você pode usar o DESCRIBE :

DESCRIBE my_table;

Ou nas versões mais recentes, você pode usar o INFORMAÇÕES_SCHEMA :

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table';

Ou você pode usar SHOW COLUMNS :

SHOW COLUMNS FROM my_table;
Greg
fonte
14
DESCREVER é na verdade um atalho para SHOW COLUMNS ( dev.mysql.com/doc/refman/5.0/en/describe.html )
Svens
11
Eu votaria na versão Information_Schema, já que essa sintaxe é suportada pela maioria dos principais bancos de dados. É melhor aprender apenas uma maneira, se for necessário.
Kibbee
3
+1 Eu queria selecionar nomes de tabelas onde uma coluna existiaSELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' AND COLUMN_NAME = 'col_name';
AL̲̳I
2
salvar bytes usando desc my_table;:-)
Alfonso Pérez
3
DESCpara descrever pode ser facilmente confundido com DESCpara descer. A quantidade nominal de bytes que você economiza pela falta de legibilidade não vale a pena.
Jacques Mathieu
34

As seguintes instruções SQL são quase equivalentes:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE table_name = 'tbl_name'
  [AND table_schema = 'db_name']
  [AND column_name LIKE 'wild']

SHOW COLUMNS
FROM tbl_name
[FROM db_name]
[LIKE 'wild']

Referência: INFORMATION_SCHEMA COLUMNS

Pôneis OMG
fonte
1
Por que você diz "quase"?
Pacerier 17/02
2
@ Pacerier Por um lado, o segundo não funcionará como subconsulta.
WAF
@ WAF, acho que ele quis dizer algo completamente diferente, não isso.
Pacerier 06/04
2
No meu teste rápido, SHOW COLUMNSretorna uma tabela que contém os nomes das colunas, tipos, etc, enquanto SELECT COLUMN NAMEretorna apenas os nomes das colunas.
Mwfearnley
20

Eu criei uma função PDO que retorna todos os nomes de colunas em uma matriz simples.

public function getColumnNames($table){
    $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = :table";
    try {
        $core = Core::getInstance();
        $stmt = $core->dbh->prepare($sql);
        $stmt->bindValue(':table', $table, PDO::PARAM_STR);
        $stmt->execute();
        $output = array();
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
            $output[] = $row['COLUMN_NAME'];                
        }
        return $output; 
    }

    catch(PDOException $pe) {
        trigger_error('Could not connect to MySQL database. ' . $pe->getMessage() , E_USER_ERROR);
    }
}

A saída será uma matriz:

Array (
[0] => id
[1] => name
[2] => email
[3] => shoe_size
[4] => likes
... )

Desculpe pelo necro, mas eu gosto da minha função;)

PS: Eu não incluí a classe Core, mas você pode usar sua própria classe. DS

Philip
fonte
O que há com o fetiche em maiúsculas?
Pacerier 17/02
Não há nada errado em responder a uma pergunta antiga no Stack Overflow.
bdsl
1
Obrigado. Para a saída, usei desta maneira: $ columns = $ stmt-> fetchAll (\ PDO :: FETCH_ASSOC); retornar array_column ($ colunas, 'COLUMN_NAME');
Ehsan
6

Esta solução é da linha de comando mysql

mysql>USE information_schema;

Na consulta abaixo, basta alterar <--DATABASE_NAME--> para o seu banco de dados e <--TABLENAME--> para o nome da tabela, onde você deseja apenas os valores dos campos da instrução DESCRIBE

mysql> SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE_SCHEMA = '<--DATABASE_NAME-->' AND   TABLE_NAME='<--TABLENAME-->';
leela
fonte
4

Também há isso se você preferir:

mysql_query('SHOW COLUMNS FROM tableName'); 
James Goodwin
fonte
4

Que tal agora:

SELECT @cCommand := GROUP_CONCAT( COLUMN_NAME ORDER BY column_name SEPARATOR ',\n')
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'my_table';

SET @cCommand = CONCAT( 'SELECT ', @cCommand, ' from my_database.my_table;');
PREPARE xCommand from @cCommand;
EXECUTE xCommand;
Wolf Metzner
fonte
4

Também é interessante notar que você pode usar o
EXPLAIN table_nameque é sinônimo DESCRIBE table_namee, SHOW COLUMNS FROM table_name embora EXPLAIN seja mais comumente usado para obter informações sobre o plano de execução da consulta.

AnthonyS
fonte
3

Investigar:

mysql_query('DESCRIBE '.$table);
Andy Hume
fonte
3

A tabela de descrição da função MySQL deve levá-lo aonde você quer ir (coloque o nome da tabela em "table"). Você terá que analisar um pouco a saída, mas é bem fácil. Pelo que me lembro, se você executar essa consulta, o resultado da consulta PHP acessando funções que normalmente dariam a você um par de valores-chave terá os nomes das colunas como as chaves. Mas já faz um tempo desde que eu usei o PHP, então não me prenda a isso. :)

dannysauer
fonte
Há alguns bons docs bonitas no php.net dentro us3.php.net/manual/en/function.mysql-list-fields.php
dannysauer
3

Você também pode querer conferir mysql_fetch_array(), como em:

$rs = mysql_query($sql);
while ($row = mysql_fetch_array($rs)) {
//$row[0] = 'First Field';
//$row['first_field'] = 'First Field';
}
thewebguy
fonte
3

Eu precisava de nomes de colunas como uma matriz plana, enquanto as outras respostas retornavam matrizes associativas, então usei:

$con = mysqli_connect('localhost',$db_user,$db_pw,$db_name);
$table = 'people';

/**
* Get the column names for a mysql table
**/

function get_column_names($con, $table) {
  $sql = 'DESCRIBE '.$table;
  $result = mysqli_query($con, $sql);

  $rows = array();
  while($row = mysqli_fetch_assoc($result)) {
    $rows[] = $row['Field'];
  }

  return $rows;
}

$col_names = function get_column_names($con, $table);

$ col_names agora é igual a:

(
    [0] => name
    [1] => parent
    [2] => number
    [3] => chart_id
    [4] => type
    [5] => id
)
duhaime
fonte
2

A mysql_list_fieldsfunção pode lhe interessar; mas, como o manual declara:

Esta função está obsoleta. É preferível usar mysql_query()para emitir uma SHOW COLUMNS FROM table [LIKE 'name']instrução SQL .

Pascal MARTIN
fonte
Como a função funciona se não emite uma consulta SQL ao servidor? Por que está sendo preterido?
Pacerier 17/02
2

você pode obter toda a estrutura da tabela usando o seguinte comando simples.

DESC TableName

ou você pode usar a seguinte consulta.

SHOW COLUMNS FROM TableName
Harish Kumar
fonte
2

no mysql para obter detalhes das colunas e estrutura da tabela seguindo palavras-chave ou consultas

1DESC table_name

2)DESCRIBE table_name

3)SHOW COLUMNS FROM table_name

4)SHOW create table table_name;

5)EXPLAIN table_name

denny
fonte
2
$col = $db->query("SHOW COLUMNS FROM category");

while ($fildss = $col->fetch_array())
{             
    $filds[] = '"{'.$fildss['Field'].'}"';
    $values[] = '$rows->'.$fildss['Field'].'';
}

if($type == 'value')
{
    return $values = implode(',', $values);
}
else {
     return $filds = implode(',', $filds);
}
ibRQD
fonte
1
Para ser mais útil para futuros usuários, forneça algum contexto para sua resposta, não apenas um despejo de código.
Paul Zahra 27/03
1

isso funcionou para mim ..

$sql = "desc MyTableName";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>";
}
Ad Kahn
fonte
1

Eu escrevi um script php simples para buscar colunas da tabela através do PHP: Show_table_columns.php

<?php
$db = 'Database'; //Database name
$host = 'Database_host'; //Hostname or Server ip
$user = 'USER'; //Database user
$pass = 'Password'; //Database user password
$con = mysql_connect($host, $user, $pass);
if ($con) {
    $link = mysql_select_db($db) or die("no database") . mysql_error();
    $count = 0;
    if ($link) {
        $sql = "
            SELECT column_name
            FROM   information_schema.columns
            WHERE  table_schema = '$db'
                   AND table_name = 'table_name'"; // Change the table_name your own table name
        $result = mysql_query($sql, $con);
        if (mysql_query($sql, $con)) {
            echo $sql . "<br> <br>";
            while ($row = mysql_fetch_row($result)) {
                echo "COLUMN " . ++$count . ": {$row[0]}<br>";
                $table_name = $row[0];
            }
            echo "<br>Total No. of COLUMNS: " . $count;
        } else {
            echo "Error in query.";
        }
    } else {
        echo "Database not found.";
    }
} else {
    echo "Connection Failed.";
}
?>

Aproveitar!

Hussnain sheikh
fonte
1
Por favor, postar a resposta real aqui e só usar a sua essência como um backup / referência
ChrisF
0

mysqli fetch_field () funcionou para mim:

if ($result = $mysqli -> query($sql)) {
  // Get field information for all fields
  while ($fieldinfo = $result -> fetch_field()) {
    printf("Name: %s\n", $fieldinfo -> name);
    printf("Table: %s\n", $fieldinfo -> table);
    printf("Max. Len: %d\n", $fieldinfo -> max_length);
  }
  $result -> free_result();
}

Fonte: https://www.w3schools.com/pHP/func_mysqli_fetch_field.asp

David M
fonte