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

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;

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


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


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-->';

4

Também há isso se você preferir:

mysql_query('SHOW COLUMNS FROM tableName'); 

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;

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.



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. :)


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';
}

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
)

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 .


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

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


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);
}

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

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!


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.