Consulta MySQL para obter nomes de colunas?


286

Gostaria de obter todos os nomes de colunas de uma tabela mysql em uma matriz em php?

Existe uma consulta para isso?

Respostas:


512

A melhor maneira é usar o banco de dados virtual de metadados INFORMATION_SCHEMA . Especificamente a tabela INFORMATION_SCHEMA.COLUMNS ...

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

É MUITO poderoso e pode fornecer toneladas de informações sem a necessidade de analisar o texto (como tipo de coluna, se a coluna é anulável, tamanho máximo da coluna, conjunto de caracteres, etc.) ...

Ah, e é SQL padrão (Considerando que SHOW ...é uma extensão específica do MySQL) ...

Para obter mais informações sobre a diferença entre SHOW...e usar as INFORMATION_SCHEMAtabelas, consulte a documentaçãoINFORMATION_SCHEMA do MySQL em geral ...


27
É apenas SQL padrão se você não usar esses backticks estúpidos específicos do mysql para citar nomes de tabelas. Eu os odeio, eles fazem meu código parecer errado.
12138 MarkR

17
@ MarkR Na verdade, não os incluí originalmente quando escrevi a resposta. Mas então parecia uma parede de escrita preta. Então eu adicionei os back-ticks para aproveitar o destaque da sintaxe. Sim, eu poderia ter SET @@SESSION.sql_mode = 'ANSI_QUOTES';antes também, mas eu realmente não gosto disso. E não tenho nenhum problema com os back-ticks para delimitação de identificador. Na verdade, eu gosto deles melhor do que aspas duplas (aspas faz com que o errado consulta sensação para mim) ... A cada um o seu próprio ...
ircmaxell

2
Não é necessário citar os nomes das tabelas no exemplo acima.
MarkRelev12

20
@ MarkR eu sei que não é. Foi por isso que eu disse que não os incluí originalmente quando escrevi a resposta . Eu adicionei-los para tirar proveito de destaque de sintaxe ...
ircmaxell

4
Esteja ciente de que, com as tabelas InnodDB, a seleção de information_schema pode ser muito lenta. Em alguns servidores de mais de um minuto
macjohn

206

Você pode usar a seguinte consulta para MYSQL:

SHOW columns FROM your-table;

Abaixo está o código de exemplo que mostra Como implementar a sintaxe acima no php para listar os nomes das colunas:

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."<br>";
}

Para detalhes sobre a saída da SHOW COLUMNS FROM TABLEvisita: MySQL Refrence.


5
Ou ... DESC TableName;;-)
double_j 15/10

Existe uma maneira de salvar a matriz para mais consultas? Gostaria de pesquisar no banco de dados $ row [4] para obter o valor na quinta coluna?
User3866044


21

Eu fiz isso no passado.

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


7

Use mysql_fetch_field()para visualizar todos os dados da coluna. Veja o manual .

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

"Aviso Esta extensão está obsoleta no PHP 5.5.0 e será removida no futuro."


2
mysqli_num_fields()e mysqli_fetch_field_direct()são os métodos atualizados
Gusstavv Gil

5

Uma função antiga do PHP "mysql_list_fields ()" está obsoleta. Portanto, hoje a melhor maneira de obter nomes de campos é uma consulta "SHOW COLUMNS FROM table_name [LIKE 'name']". Então, aqui está um pequeno exemplo:

$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

Não tenho certeza se é isso que você estava procurando, mas funcionou para mim:

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

Isso retorna uma matriz simples dos nomes de colunas / nomes de variáveis ​​em sua tabela ou matriz como strings, que é o que eu precisava para criar dinamicamente consultas MySQL. Minha frustração foi que eu simplesmente não sabia como indexar matrizes muito bem em PHP, então não tinha certeza do que fazer com os resultados de DESC ou SHOW. Espero que minha resposta seja útil para iniciantes como eu!

Para verificar o resultado: print_r($col_names);


4

quando você quiser verificar toda a estrutura de sua tabela com alguns arquivos, use esse código. Nesta consulta, selecione column_name, column_type e table_name para obter mais detalhes. Eu uso order by column_type para que eu possa vê-lo facilmente.

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;

Se você quiser verificar apenas o tipo duplo arquivado, poderá fazê-lo facilmente

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;

insira a descrição da imagem aqui

se você quiser verificar qual campo permite o tipo nulo, etc., poderá usar este

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;

insira a descrição da imagem aqui

você deseja verificar mais do que o link thik também ajudá-lo.

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


Boa. Muito útil.
Sazzad Hissain Khan

3

SHOW COLUMNS no mysql 5.1 (não 5.5) usa uma tabela de disco temporária.

Portanto, pode ser considerado lento em alguns casos. Pelo menos, ele pode aumentar seu valor created_tmp_disk_tables . Imagine uma tabela de disco temporária por conexão ou por cada solicitação de página.

SHOW COLUMNS não é tão lento, possivelmente porque usa o cache do sistema de arquivos. Phpmyadmin diz ~ 0.5ms de forma consistente. Isso não é nada comparado a 500ms-1000ms de servir uma página wordpress. Mas, ainda assim, há momentos em que isso importa. Há um envolvimento do sistema de disco, você nunca sabe o que acontece quando o servidor está ocupado, o cache está cheio, o disco rígido está parado etc.

A recuperação de nomes de colunas por meio de SELECT * FROM ... LIMIT 1 estava em torno de ~ 0,1ms e também pode usar o cache de consultas.

Então, aqui está meu pequeno código otimizado para obter nomes de colunas de uma tabela, sem usar as colunas show, se possível:

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

Notas:

  • Contanto que a primeira linha da tabela não contenha um intervalo de dados em megabytes, ela deverá funcionar bem.
  • Os nomes das funções db_rows e db_row_ar devem ser substituídos pela sua configuração específica do banco de dados.

Oi Johan, recebo o erro: Chame a função indefinida db_row_ar (), quando executo db_columns_ar ('myTableName');
KarlosFontana

Desculpe por isso, vou esclarecer isso em texto. Esse era um nome de função imaginário, representando o que sua classe ou configuração de banco de dados usa para esse tipo de coisa.
31413 Johan

3

Experimente este, eu pessoalmente o uso:

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

1
por que você está selecionando apenas os nomes das colunas "stock_id" e "drug_name"?
22815 Frank Bryce

trabalhou para mim, mas sem o "onde ..." coisas. Com DOP: $ this-> dbHandle = novo DOP (...); $ query = 'MOSTRAR COLUNAS DE'. $ tableName; $ stmt = $ this-> dbHandle-> query ($ query); $ resultados = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ resultados como $ result) {// fazer alguma coisa com cada $ result}
Zaphoid

2

NO WORDPRESS:

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

2

Essa pergunta é antiga, mas cheguei aqui procurando uma maneira de encontrar uma determinada consulta com seus nomes de campo de forma dinâmica (não necessariamente apenas os campos de uma tabela). E como as pessoas apontam isso como a resposta para essa tarefa em outras questões relacionadas, estou compartilhando o modo como descobri que isso pode ser feito, usando as dicas de 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>";
    }
}

Isso pode ser facilmente modificado para inserir os nomes dos campos em uma matriz.

Usando um simples: $sql="SELECT * FROM myTable LIMIT 1"pode fornecer os campos de qualquer tabela, sem a necessidade de usar SHOW COLUMNSou de qualquer módulo php extra, se necessário (removendo a parte do dump de dados).

Espero que isso ajude outra pessoa.


2

Se você usa php, use esta essência .

ele pode obter informações completas dos campos selecionados sem resultado , e todos os campos personalizados, como:

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

se acima do sql não retornar dados, também receberá os nomes dos campos aname, bname, outro nome do campo b

apenas duas linhas:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();

2

Esta consulta busca uma lista de todas as colunas em um banco de dados sem precisar especificar um nome de tabela. Retorna uma lista de apenas nomes de colunas:

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

No entanto, quando executei esta consulta no phpmyadmin, ela exibiu uma série de erros. No entanto, funcionou. Portanto, use-o com cautela.


2

A solução mais simples de todas as respostas:

DESC `table name`

ou

DESCRIBE `table name`

ou

SHOW COLUMNS FROM `table name`

2

se você precisar apenas dos nomes e tipos de campos (talvez para facilitar a cópia e colar no Excel):

SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'

remover

DATA_TYPE='decimal'

se você quiser todos os tipos de dados


1

Eu não sou especialista, mas isso funciona para mim ..

$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

Eu tentei esta consulta no SQL Server e funcionou para mim:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
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.