¿Consulta MySQL para obtener nombres de columna?

286

Me gustaría obtener todos los nombres de columnas de una tabla mysql en una matriz en php?

¿Hay alguna consulta para esto?

Haroldo
fuente

Respuestas:

512

La mejor manera es usar la base de datos virtual de metadatos INFORMATION_SCHEMA . Específicamente la tabla INFORMATION_SCHEMA.COLUMNS ...

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

Es MUY poderoso y puede brindarle TONELADAS de información sin necesidad de analizar el texto (como el tipo de columna, si la columna es anulable, el tamaño máximo de la columna, el conjunto de caracteres, etc.) ...

Ah, y es SQL estándar (mientras que SHOW ...es una extensión específica de MySQL) ...

Para obtener más información sobre la diferencia entre SHOW...y el uso de las INFORMATION_SCHEMAtablas, consulte la documentación deINFORMATION_SCHEMA MySQL en general ...

ircmaxell
fuente
27
Es solo SQL estándar si no usa esos estúpidos backticks específicos de mysql para citar nombres de tablas. Los odio, hacen que mi código se vea mal.
MarkR
17
@MarkR En realidad, no los incluí originalmente cuando escribí la respuesta. Pero luego parecía una pared de escritura negra. Así que agregué los ticks posteriores para aprovechar el resaltado de sintaxis. Sí, podría haberlo hecho de SET @@SESSION.sql_mode = 'ANSI_QUOTES';antemano también, pero realmente no me gusta eso. Y no tengo ningún problema con los ticks de retroceso para la delimitación de identificadores. De hecho, yo como ellos mejor que comillas (comillas dobles hace que la sensación equivocada de consulta para mí) ... Para cada uno su propio ...
ircmaxell
2
No es obligatorio citar los nombres de las tablas en el ejemplo anterior.
MarkR
20
@ Mark Sé que no lo es. Es por eso que dije que en realidad no los incluí originalmente cuando escribí la respuesta . Los agregué para aprovechar el resaltado de sintaxis ...
ircmaxell
44
Tenga en cuenta que con InnodDB, las tablas seleccionadas de information_schema pueden ser muy lentas. En algunos servidores más de un minuto
macjohn
206

Puede usar la siguiente consulta para MYSQL:

SHOW columns FROM your-table;

A continuación se muestra el código de ejemplo que muestra cómo implementar la sintaxis anterior en php para enumerar los nombres de las columnas:

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

Para obtener detalles sobre la salida de la SHOW COLUMNS FROM TABLEvisita: MySQL Refrence.

bcosca
fuente
55
O ... DESC TableName;;-)
double_j
¿Hay alguna manera de guardar la matriz para más consultas? ¿Desea buscar $ row [4] en la base de datos para obtener el valor en la quinta columna?
user3866044
43

Parece que hay 2 formas:

DESCRIBE `tablename`

o

SHOW COLUMNS FROM `tablename`

Más DESCRIBEaquí: http://dev.mysql.com/doc/refman/5.0/en/describe.html

Sueños surrealistas
fuente
44
Ahh, DESCRIBEes solo un atajo para SHOW COLUMNS FROM.
Surreal Dreams
77
¡Y DESCes aún más corto para DESCRIBE!
Brett Widmeier
21

He hecho esto en el pasado.

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

Use mysql_fetch_field()para ver todos los datos de la columna. Ver 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;
}

"Advertencia Esta extensión está en desuso a partir de PHP 5.5.0 y se eliminará en el futuro".

Gavin Simpson
fuente
2
mysqli_num_fields()y mysqli_fetch_field_direct()son los métodos actualizados
Gusstavv Gil
5

Una antigua función PHP "mysql_list_fields ()" está en desuso. Entonces, hoy la mejor forma de obtener nombres de campos es una consulta "MOSTRAR COLUMNAS DE nombre_tabla [COMO 'nombre']". Entonces, aquí hay un pequeño ejemplo:

$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; }
usuario2558588
fuente
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();
Abdul Gaffar Shah
fuente
4

No estoy seguro de si esto es lo que estaba buscando, pero esto funcionó para mí:

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

Eso devuelve una matriz simple de nombres de columnas / nombres de variables en su tabla o matriz como cadenas, que es lo que necesitaba para generar dinámicamente consultas MySQL. Mi frustración fue que simplemente no sé cómo indexar matrices en PHP muy bien, así que no estaba seguro de qué hacer con los resultados de DESC o SHOW. ¡Espero que mi respuesta sea útil para principiantes como yo!

Para verificar el resultado: print_r($col_names);

useranon
fuente
4

cuando desee verificar la estructura de todas las tablas con algunos archivados, use este código. En esta consulta selecciono column_name, column_type y table_name para más detalles. Uso order by column_type para poder verlo fácilmente.

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

Si desea marcar solo el tipo doble archivado, puede hacerlo fácilmente

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;

ingrese la descripción de la imagen aquí

si desea verificar qué campo permite el tipo nulo, etc., puede usar esto

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;

ingrese la descripción de la imagen aquí

desea comprobar más, luego este enlace también lo ayudará.

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

Shafiqul Islam
fuente
Bueno. Muy útil.
Sazzad Hissain Khan
3

SHOW COLUMNS en mysql 5.1 (no 5.5) usa una tabla de disco temporal.

Por lo tanto, puede considerarse lento para algunos casos. Al menos, puede aumentar su valor created_tmp_disk_tables . Imagine una tabla de disco temporal por conexión o por cada solicitud de página.

MOSTRAR COLUMNAS no es realmente tan lento, posiblemente porque usa caché del sistema de archivos. Phpmyadmin dice ~ 0.5ms consistentemente. Esto no es nada en comparación con 500ms-1000ms de servir una página de WordPress. Pero aún así, hay veces que importa. Existe una participación del sistema de disco, nunca se sabe lo que sucede cuando el servidor está ocupado, el caché está lleno, el disco duro está bloqueado, etc.

La recuperación de los nombres de columna a través de SELECT * FROM ... LIMIT 1 fue de alrededor de ~ 0.1ms, y también puede usar la caché de consultas.

Así que aquí está mi pequeño código optimizado para obtener nombres de columnas de una tabla, sin usar show columnas si es posible:

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:

  • Siempre que la primera fila de su tabla no contenga un rango de datos de megabytes, debería funcionar bien.
  • Los nombres de función db_rows y db_row_ar deben reemplazarse con la configuración de su base de datos específica.
Johan
fuente
Hola Johan, recibo el error: Llamar a la función indefinida db_row_ar (), cuando ejecuto db_columns_ar ('myTableName');
KarlosFontana
Lo siento, lo aclararé en el texto. Ese era un nombre de función imaginario, que representaba cualquier clase de base de datos o configuración utilizada para ese tipo de cosas.
Johan
3

Prueba este, yo personalmente lo uso:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 
mohsin
fuente
1
¿Por qué selecciona solo los nombres de columna "stock_id" y "drug_name"?
Frank Bryce
funcionó para mí pero sin el "dónde ..." cosas. Con PDO: $ this-> dbHandle = new PDO (...); $ query = 'MOSTRAR COLUMNAS DE'. $ tableName; $ stmt = $ this-> dbHandle-> query ($ consulta); $ resultados = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ resultados como $ resultado) {// hacer algo con cada $ resultado}
Zaphoid
2

En palabras:

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

Esta pregunta es antigua, pero llegué aquí buscando una manera de encontrar una consulta determinada con sus nombres de campo de forma dinámica (no necesariamente solo los campos de una tabla). Y dado que la gente sigue señalando esto como la respuesta para esa tarea dada en otras preguntas relacionadas, comparto la forma en que descubrí que se puede hacer, usando los consejos 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>";
    }
}

Esto se puede modificar fácilmente para insertar los nombres de campo en una matriz.

Usando un simple: $sql="SELECT * FROM myTable LIMIT 1"puede darle los campos de cualquier tabla, sin necesidad de usarSHOW COLUMNS o ningún módulo php adicional, si es necesario (eliminando la parte de volcado de datos).

Esperemos que esto ayude a alguien más.

Gusstavv Gil
fuente
2

si usas php, usa esta esencia .

puede obtener información completa de campos seleccionados sin resultado, y todos los campos personalizados como:

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

si arriba de sql no devuelve datos, también obtendrá los nombres de campo aname, bname, otro nombre de campo de b

solo dos líneas:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();
zhi.yang
fuente
2

Esta consulta obtiene una lista de todas las columnas de una base de datos sin tener que especificar un nombre de tabla. Devuelve una lista de solo nombres de columna:

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

Sin embargo, cuando ejecuté esta consulta en phpmyadmin, mostró una serie de errores. No obstante, funcionó. Así que úsalo con precaución.


fuente
2

La solución más simple de todas las respuestas:

DESC `table name`

o

DESCRIBE `table name`

o

SHOW COLUMNS FROM `table name`
Gil Baggio
fuente
2

si solo necesita los nombres y tipos de campo (quizás para copiar y pegar fácilmente en Excel):

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

eliminar

DATA_TYPE='decimal'

si quieres todos los tipos de datos

Amir No-Family
fuente
1

No soy un experto, pero esto funciona para mí.

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

}
Ad Kahn
fuente
0

He intentado esta consulta en SQL Server y esto funcionó para mí:

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