Web

Запрос MySQL для получения имен столбцов таблицы

Я хотел бы получить все имена столбцов таблицы mysql в массив на php.

Есть ли для этого запрос?

 

Ответ 1

Лучше всего использовать виртуальную базу данных метаданных INFORMATION_SCHEMA. В частности, таблица INFORMATION_SCHEMA.COLUMNS...

SELECT `COLUMN_NAME` 

FROM `INFORMATION_SCHEMA`.`COLUMNS` 

WHERE `TABLE_SCHEMA`='yourdatabasename' 

    AND `TABLE_NAME`='yourtablename';

 

Это ОЧЕНЬ мощный способ, и он может предоставить вам ТОННЫ информации без необходимости анализировать текст (например, тип столбца, наличие в нем значения NULL, максимальный размер столбца, набор символов и т. д.).

И это стандартный SQL (в то время как SHOW это расширение для MySQL).

Для получения дополнительной информации о различиях между таблицами SHOW...и их использовании с INFORMATION_SCHEMA, ознакомьтесь с общей документацией INFORMATION_SCHEMA для MySQL.

 

Ответ 2

Вы можете использовать следующий запрос для 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 ознакомьтесь с документацией.

 

Ответ 3

Используйте 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 и будет удалено в будущем».

 

Ответ 4

Старая функция 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; }

 

 

Ответ 5

Если вы хотите проверить всю структуру таблицы с некоторыми полями, используйте этот код. В этом запросе я выбираю имя_столбца, тип_столбца и имя_таблицы для получения дополнительных сведений. Я использую order by 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;

 

Если вы хотите проверить, какое поле разрешает нулевой тип и т. д., можно использовать это:

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;

 

 

Ответ 6

Не уверен, что это то, что вы искали, но у меня это сработало:

$query     = query("DESC YourTable");  

$col_names = array_column($query, 'Field');

 

Этот код возвращает простой массив имен столбцов/имен переменных в вашей таблице или массиве в виде строк, что нужно для динамического построения запросов MySQL. Мое разочарование заключается в том, что я просто не знаю, как правильно индексировать массивы в PHP, поэтому я не уверен, что делать с результатами DESC или SHOW. Надеюсь, мой ответ будет полезен для таких новичков, как я!

Для получения результата:

 print_r($col_names);

 

Ответ 7

SHOW COLUMNS в mysql 5.1 (не 5.5) использует временную дисковую таблицу.

Поэтому в некоторых случаях его можно считать медленным. По крайней мере, это может увеличить значение created_tmp_disk_tables. Представьте себе одну временную дисковую таблицу на соединение или на каждый запрос страницы.

SHOW COLUMNS на самом деле не так медленна, возможно, потому что она использует кэш файловой системы. PhpMyAdmin постоянно говорит о ~0.5 мс. Это ничто, по сравнению с 500-1000 мс при обслуживании страницы wordpress. Но все же есть моменты, когда это имеет значение. Здесь задействована дисковая система; никогда не знаешь, что произойдет, когда сервер занят, кэш переполнен, hdd завис и т. д.

Получение имен колонок через SELECT * FROM ... LIMIT 1 заняло около ~0.1 мс, и оно также может использовать кэш запросов.

Итак, вот мой небольшой оптимизированный код для получения имен столбцов из таблицы без использования show columns, если это возможно:

function db_columns_ar($table) {

//возвращает 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];

$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 должны быть заменены вашей конкретной настройкой базы данных.

Схожие статьи

Web

Как использовать str_replace, чтобы она действовала только при первом совпадении

Как студенту попасть на стажировку в Гугл в Москве: доступные способы
Web

Как студенту попасть на стажировку в Гугл в Москве: доступные способы

Web

Как определить, пуста ли переменная bash?

Web

Могу ли я расширить некоторый класс, используя более одного базового класса в PHP