Zapytanie MySQL, aby uzyskać nazwy kolumn?

286

Chciałbym przenieść wszystkie nazwy col tabeli mysql do tablicy w php?

Czy jest na to pytanie?

Haroldo
źródło

Odpowiedzi:

512

Najlepszym sposobem jest użycie wirtualnej bazy danych metadanych INFORMACJE_SCHEMA . W szczególności tabela INFORMACJE_SCHEMA.COLUMNS ...

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

Jest BARDZO potężny i może dostarczyć TONI informacji bez konieczności analizowania tekstu (np. Typ kolumny, czy kolumna ma wartość zerową, maksymalny rozmiar kolumny, zestaw znaków itp.) ...

Aha, i to jest standardowy SQL (podczas gdy SHOW ...jest to rozszerzenie specyficzne dla MySQL) ...

Aby uzyskać więcej informacji na temat różnicy między tabelami SHOW...i korzystania z nich INFORMATION_SCHEMA, zapoznaj się ogólnie z dokumentacjąINFORMATION_SCHEMA MySQL ...

ircmaxell
źródło
27
Jest to tylko standardowy SQL, jeśli nie użyjesz tych głupich backsicków specyficznych dla mysql do cytowania nazw tabel. Nienawidzę ich, sprawiają, że mój kod wygląda źle.
MarkR
17
@ MarkR Właściwie nie uwzględniłem ich oryginalnie, kiedy napisałem odpowiedź. Ale potem wyglądało to jak ściana czarnego pisma. Dodałem więc tyknięcia wstecz, aby skorzystać z podświetlania składni. Tak, też mogłem mieć SET @@SESSION.sql_mode = 'ANSI_QUOTES';przed ręką, ale tak naprawdę to nie lubię. I nie mam problemu z tyknięciami wstecznymi dla delimitacji identyfikatora. W rzeczywistości lubię je bardziej niż podwójne cudzysłowy (podwójne cudzysłowy sprawiają, że zapytanie wydaje mi się złe) ... Do każdego z nich ...
ircmaxell
2
Cytując nazwy tabel wcale nie jest wymagane w powyższym przykładzie.
MarkR
20
@ MarkR Wiem, że to nie jest. Właśnie dlatego powiedziałem , że nie uwzględniłem ich pierwotnie, kiedy napisałem odpowiedź . Dodałem je, aby skorzystać z podświetlania składni ...
ircmaxell,
4
Należy pamiętać, że dzięki tabelom InnodDB wybranie opcji Information_schema może być bardzo boleśnie powolne. Na niektórych serwerach więcej niż jedna minuta
macjohn
206

Możesz użyć następującego zapytania dla MYSQL:

SHOW columns FROM your-table;

Poniżej znajduje się przykładowy kod, który pokazuje jak zaimplementować powyższą składnię w php, aby wyświetlić nazwy kolumn:

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

Szczegółowe informacje na temat wyników SHOW COLUMNS FROM TABLEwizyty: MySQL Refrence.

bcosca
źródło
5
Lub ... DESC TableName;;-)
double_j
Czy istnieje sposób na zapisanie tablicy dla większej liczby zapytań? Chcesz przeszukać bazę danych w poszukiwaniu $ row [4], aby uzyskać wartość w piątej kolumnie?
user3866044
43

Wydaje się, że istnieją 2 sposoby:

DESCRIBE `tablename`

lub

SHOW COLUMNS FROM `tablename`

Więcej DESCRIBEtutaj: http://dev.mysql.com/doc/refman/5.0/en/describe.html

Surrealistyczne sny
źródło
4
Ahh, DESCRIBEto tylko skrót do SHOW COLUMNS FROM.
Surreal Dreams,
7
I DESCjest nawet krótszy dla DESCRIBE!
Brett Widmeier
21

Zrobiłem to w przeszłości.

SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here'; 
Jeff
źródło
7

Służy mysql_fetch_field()do wyświetlania wszystkich danych kolumn. Zobacz instrukcję .

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

„Ostrzeżenie To rozszerzenie jest nieaktualne od PHP 5.5.0 i zostanie usunięte w przyszłości.”

Gavin Simpson
źródło
2
mysqli_num_fields()i mysqli_fetch_field_direct()są zaktualizowane metody
Gusstavv Gil 24.04.16
5

Stara funkcja PHP „mysql_list_fields ()” jest przestarzała. Tak więc dzisiaj najlepszym sposobem na uzyskanie nazw pól jest zapytanie „POKAŻ KOLUMNY Z nazwy_tabeli [JAK” nazwa ”]”. Oto mały przykład:

$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; }
użytkownik2558588
źródło
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
źródło
4

Nie jestem pewien, czy tego właśnie szukałeś, ale działało to dla mnie:

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

Zwraca prostą tablicę nazw kolumn / nazw zmiennych w tabeli lub tablicy jako ciągi, co jest tym, czego potrzebowałem, aby dynamicznie budować zapytania MySQL. Moją frustracją było to, że po prostu nie wiem, jak bardzo dobrze indeksować tablice w PHP, więc nie byłem pewien, co zrobić z wynikami DESC lub SHOW. Mam nadzieję, że moja odpowiedź jest pomocna dla początkujących takich jak ja!

Aby sprawdzić wynik: print_r($col_names);

useranon
źródło
4

jeśli chcesz sprawdzić całą strukturę tabeli z niektórymi plikami, użyj tego kodu. W tym zapytaniu wybieram nazwę kolumny, typ kolumny i nazwę tabeli, aby uzyskać więcej informacji. Korzystam z sortowania według typu kolumny, więc mogę to łatwo zobaczyć.

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

Jeśli chcesz sprawdzić tylko dwa typy plików, możesz to zrobić z łatwością

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;

wprowadź opis zdjęcia tutaj

jeśli chcesz sprawdzić, które pole zezwala na typ zerowy itp., możesz użyć tego

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;

wprowadź opis zdjęcia tutaj

chcesz sprawdzić więcej niż link, który Ci również pomoże.

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

Shafiqul Islam
źródło
Dobry. Bardzo pomocne.
Sazzad Hissain Khan
3

POKAŻ KOLUMNY w mysql 5.1 (nie 5.5) używa tymczasowej tabeli dysków.

W niektórych przypadkach można to uznać za wolne. Przynajmniej może podbić swoją created_tmp_disk_tables wartość. Wyobraź sobie jedną tymczasową tabelę dyskową na połączenie lub na każde żądanie strony.

POKAŻ KOLUMNY nie jest tak powolne, prawdopodobnie dlatego, że używa pamięci podręcznej systemu plików. Phpmyadmin mówi ~ 0,5 ms konsekwentnie. To nic w porównaniu z 500ms-1000ms obsługi strony wordpress. Ale wciąż są chwile, które mają znaczenie. Zaangażowany jest system dyskowy, nigdy nie wiadomo, co się stanie, gdy serwer jest zajęty, pamięć podręczna jest pełna, dysk twardy jest zablokowany itp.

Pobieranie nazw kolumn za pomocą SELECT * FROM ... LIMIT 1 trwało około ~ 0,1 ms i może również używać pamięci podręcznej zapytań.

Oto mój mały zoptymalizowany kod do pobierania nazw kolumn z tabeli, bez używania kolumn show, jeśli to możliwe:

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

Uwagi:

  • Tak długo, jak pierwszy wiersz tabel nie zawiera zakresu danych w megabajtach, powinien działać poprawnie.
  • Nazwy funkcji db_rows i db_row_ar należy zastąpić określoną konfiguracją bazy danych.
Johan
źródło
Cześć Johan, pojawia się błąd: wywołanie niezdefiniowanej funkcji db_row_ar (), kiedy uruchamiam db_columns_ar ('myTableName');
KarlosFontana
Przepraszam za to, wyjaśnię to w tekście. To była wymyślona nazwa funkcji, oznaczająca dowolną klasę bazy danych lub konfigurację używaną do tego typu rzeczy.
Johan
3

Wypróbuj ten, którego osobiście używam:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 
mohsin
źródło
1
dlaczego wybieracie tylko nazwy kolumn „stock_id” i „drug_name”?
Frank Bryce,
pracował dla mnie, ale bez rzeczy „gdzie ...”. Z ChNP: $ this-> dbHandle = nowy ChNP (...); $ query = 'POKAŻ KOLUMNY OD'. $ tableName; $ stmt = $ this-> dbHandle-> zapytanie ($ zapytanie); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ wyniki jako $ wynik) {// zrób coś z każdym wynikiem $}
Zaphoid
2

W WORDPRESS:

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

To pytanie jest stare, ale znalazłem tutaj sposób na znalezienie danego zapytania w jego nazwach pól w sposób dynamiczny (niekoniecznie tylko pola tabeli). A ponieważ ludzie wciąż wskazują to jako odpowiedź na to zadanie w innych powiązanych pytaniach, dzielę się sposobem, w jaki według mnie można to zrobić, korzystając ze wskazówek Gavina Simpsona:

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

Można to łatwo zmodyfikować, aby wstawić nazwy pól do tablicy.

Używając prostego: $sql="SELECT * FROM myTable LIMIT 1"może dać ci pola dowolnej tabeli, bez potrzeby użycia SHOW COLUMNSlub dodatkowego modułu php, jeśli to konieczne (usunięcie części zrzutu danych).

Mam nadzieję, że pomoże to komuś innemu.

Gusstavv Gil
źródło
2

jeśli używasz php, użyj tego sens .

może uzyskać pełne informacje o wybranych polach bez rezultatu oraz wszystkie pola niestandardowe, takie jak:

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

jeśli powyżej sql nie zwróci danych, otrzyma także nazwy pól aname, bname, b inne nazwy pól

tylko dwie linie:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();
zhi.yang
źródło
2

To zapytanie pobiera listę wszystkich kolumn w bazie danych bez konieczności określania nazwy tabeli. Zwraca listę tylko nazw kolumn:

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

Jednak gdy uruchomiłem to zapytanie w phpmyadmin, wyświetliło się szereg błędów. Niemniej jednak zadziałało. Dlatego używaj go ostrożnie.


źródło
2

Najprostsze rozwiązanie spośród wszystkich odpowiedzi:

DESC `table name`

lub

DESCRIBE `table name`

lub

SHOW COLUMNS FROM `table name`
Gil Baggio
źródło
2

jeśli potrzebujesz tylko nazw i typów pól (być może do łatwego wklejenia do Excela):

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

usunąć

DATA_TYPE='decimal'

jeśli chcesz wszystkie typy danych

Amir No-Family
źródło
1

nie jestem ekspertem, ale to działa dla mnie ..

$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
źródło
0

Próbowałem tego zapytania w SQL Server i to zadziałało dla mnie:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Purvi Barot
źródło