Запит MySQL, щоб отримати назви стовпців?


286

Я хотів би отримати всі назви посилань таблиці mysql в масив в php?

Чи є запит на це?

Відповіді:


513

Найкращим способом є використання віртуальної бази даних метаданих INFORMATION_SCHEMA . Зокрема таблиця INFORMATION_SCHEMA.COLUMNS ...

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

Це ДУЖЕ потужно, і може дати вам ТОНСІ інформації без розбору тексту (наприклад, тип стовпця, чи є стовпчик нульовим, максимальний розмір стовпця, набір символів тощо) ...

О, і це стандартний SQL (тоді SHOW ...як специфічне розширення MySQL) ...

Щоб отримати додаткові відомості про різницю між SHOW...та використанням INFORMATION_SCHEMAтаблиць, ознайомтеся з документацією наINFORMATION_SCHEMA MySQL в цілому ...


27
Це єдиний стандарт SQL, якщо ви не використовуєте ці дурні специфічні для mysql задники для цитування імен таблиць. Я ненавиджу їх, вони роблять мій код неправильним.
MarkR

17
@MarkR Я фактично не включав їх спочатку, коли писав відповідь. Але тоді це просто виглядало як стіна з чорного письма. Тому я додав зворотні тики, щоб скористатися виділенням синтаксису. Так, я міг би бути і SET @@SESSION.sql_mode = 'ANSI_QUOTES';перед цим, але мені це дуже не подобається. І у мене немає проблем із зворотними тиками для розмежування ідентифікаторів. Насправді вони мені подобаються краще, ніж подвійні лапки (подвійні лапки змушують запит вважати мене неправильним) ... Кожному своє ...
ircmaxell

2
Цитування назв таблиць взагалі не потрібно в наведеному вище прикладі.
MarkR

20
@MarkR Я знаю, що це не так. Тому я сказав, що фактично не включав їх, коли писав відповідь . Я додав їх, щоб скористатися виділенням синтаксису ...
ircmaxell

4
Майте на увазі, що за допомогою таблиць InnodDB вибір із інформації_схеми може бути дуже болісно повільним. На деяких серверах більше однієї хвилини
macjohn

206

Ви можете використовувати наступний запит для 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відвідування: MySQL Refrence.


5
Або ... DESC TableName;;-)
double_j

Чи є спосіб зберегти масив для отримання більше запитів? Як би шукати в базі даних $ row [4], щоб отримати значення в п'ятому стовпці?
користувач3866044


21

Я робив це в минулому.

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


7

Використовуйте 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, і воно буде видалено в майбутньому."


2
mysqli_num_fields()та mysqli_fetch_field_direct()є оновленими методами
Густавв Гіл

5

Стара функція PHP "mysql_list_fields ()" застаріла. Отже, на сьогодні найкращим способом отримання назв полів є запит "ПОКАЖИТИ КОЛІНІ З ІМЕНА таблиці [LIKE 'ім'я']". Отже, ось невеликий приклад:

$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

Не впевнений, що це те, що ви шукали, але це працювало для мене:

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

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

Щоб перевірити результат: print_r($col_names);


4

коли ви хочете перевірити всю структуру таблиці з деякими поданими файлами, використовуйте цей код. У цьому запиті я вибираю ім'я стовпця, тип стовпця та ім’я таблиці_ для отримання більш детальної інформації. Я використовую замовлення за стовпчиком_типу, щоб я міг легко бачити його.

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;

введіть тут опис зображення

Ви хочете перевірити більше, ніж допоможе Вам також посилання.

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


Добре. Дуже корисний.
Саззад Хіссан Хан

3

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

Тож це може вважатися повільним для деяких випадків. Принаймні, воно може підміняти ваше створене значення_dmp_disk_tables. Уявіть одну таблицю тимчасових дисків за з'єднання або за кожний запит на сторінку.

SHOW COLUMNS насправді не так повільно, можливо, тому що він використовує кеш файлової системи. Phpmyadmin каже ~ 0,5 мс послідовно. Це ніщо в порівнянні з 500мс-1000мс розміщення сторінки Wordpress. Але все ж, буває, що це має значення. Є задіяність дискової системи, ви ніколи не знаєте, що відбувається, коли сервер зайнятий, кеш заповнений, hdd застопорився і т.д.

Отримання імен стовпців через SELECT * FROM ... LIMIT 1 становило близько ~ 0,1 мс, і він також може використовувати кеш запитів.

Отже, ось мій маленький оптимізований код для отримання назв стовпців із таблиці, не використовуючи, якщо можливо, показувати стовпці :

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

Примітки:

  • Поки ваші таблиці в першому рядку не містять мегабайтний діапазон даних, він повинен працювати нормально.
  • Імена функцій db_rows та db_row_ar слід замінити вашими конкретними налаштуваннями бази даних.

Привіт Йохане, я отримую помилку: дзвінок до невизначеної функції db_row_ar (), коли я запускаю db_column_ar ('myTableName');
KarlosFontana

Вибачте за це, я поясню це в тексті. Це було уявне ім'я функції, яке відповідає тому, що ваш клас бази даних чи установка використовує для цього типу речей.
Йоган

3

Спробуйте це, я особисто його використовую:

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

1
чому ви вибираєте лише назви стовпців "stock_id" та "drug_name"?
Френк Брайс

працював для мене, але без речі "де ..." З PDO: $ this-> dbHandle = новий PDO (...); $ query = 'ПОКАЖИТИ КОЛИНИ З ВІД'. $ tableName; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ results as $ result) {// робити щось із кожним $ результатом}
Zaphoid

2

У СТВОРЕННІ:

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

2

Це питання давнє, але я потрапив сюди, шукаючи спосіб знайти заданий запит назви його полів динамічним способом (не обов'язково лише поля таблиці). І оскільки люди продовжують вказувати це як відповідь на це завдання в інших пов'язаних питаннях, я ділюсь тим, як я виявив, що це можна зробити, використовуючи поради Гевіна Сімпсона:

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

Це можна легко модифікувати для вставки імен полів у масив.

Використання простого: $sql="SELECT * FROM myTable LIMIT 1"може дати вам поля будь-якої таблиці, не потребуючи використання SHOW COLUMNSчи додаткового модуля php, якщо це потрібно (видалення частини дампа даних).

Сподіваємось, це допомагає комусь іншому.


2

якщо ви використовуєте php, використовуйте цю суть .

вона може отримати повні відомості про вибрані поля без результату , та всі власні поля, такі як:

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

якщо вище sql не поверне жодних даних, вони також отримають імена полів aname, bname, b інше ім'я поля

всього два рядки:

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

2

Цей запит отримує список усіх стовпців у базі даних, не вказуючи ім’я таблиці. Він повертає список лише назв стовпців:

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

Однак, коли я запустив цей запит у phpmyadmin, він відобразив ряд помилок. Тим не менш, це спрацювало. Тому використовуйте його обережно.


2

Найпростіше рішення з усіх відповідей:

DESC `table name`

або

DESCRIBE `table name`

або

SHOW COLUMNS FROM `table name`

2

якщо вам потрібні лише імена та типи полів (можливо, для простого вставки копії в Excel):

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

видалити

DATA_TYPE='decimal'

якщо потрібно всі типи даних


1

Я не експерт, але це працює для мене.

$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

Я спробував цей запит у SQL Server, і він працював для мене:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.