Truy vấn MySQL để lấy tên cột?


286

Tôi muốn chuyển tất cả các tên col của bảng mysql thành một mảng trong php?

Có một truy vấn cho điều này?

Câu trả lời:


512

Cách tốt nhất là sử dụng cơ sở dữ liệu ảo siêu dữ liệu Information_SCHema . Cụ thể là bảng Information_SCHema.COLUMNS ...

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

Nó RẤT mạnh mẽ và có thể cung cấp cho bạn TẤN thông tin mà không cần phân tích văn bản (Chẳng hạn như loại cột, cho dù cột có thể rỗng, kích thước cột tối đa, bộ ký tự, v.v.) ...

Ồ, và đó là SQL tiêu chuẩn (Trong khi đó SHOW ...là một phần mở rộng cụ thể của MySQL) ...

Để biết thêm thông tin về sự khác biệt giữa SHOW...và sử dụng các INFORMATION_SCHEMAbảng, hãy xem Tài liệuINFORMATION_SCHEMA MySQL nói chung ...


27
Đó chỉ là SQL tiêu chuẩn nếu bạn không sử dụng các backticks cụ thể của mysql để trích dẫn tên bảng. Tôi ghét họ, họ làm cho mã của tôi nhìn sai.
MarkR

17
@MarkR Tôi thực sự không bao gồm chúng ban đầu khi tôi viết câu trả lời. Nhưng sau đó, nó trông giống như một bức tường viết màu đen. Vì vậy, tôi đã thêm các dấu kiểm ngược để tận dụng cú pháp tô sáng. Vâng, tôi cũng có thể có SET @@SESSION.sql_mode = 'ANSI_QUOTES';trước, nhưng tôi thực sự không thích điều đó. Và tôi không có vấn đề gì với các dấu kiểm lại để phân định định danh. Trên thực tế, tôi thích chúng hơn là trích dẫn kép (trích dẫn kép làm cho truy vấn cảm thấy sai đối với tôi) ... Với mỗi câu hỏi của riêng họ ...
ircmaxell

2
Trích dẫn tên bảng hoàn toàn không cần thiết trong ví dụ trên.
MarkR

20
@MarkR Tôi biết không phải vậy. Đó là lý do tại sao tôi nói rằng tôi thực sự không bao gồm chúng ban đầu khi tôi viết câu trả lời . Tôi đã thêm chúng để tận dụng cú pháp tô sáng ...
ircmaxell

4
Xin lưu ý rằng với các bảng InnodDB, chọn từ information_schema có thể rất chậm. Trong một số máy chủ hơn một phút
macjohn

206

Bạn có thể sử dụng truy vấn sau cho MYSQL:

SHOW columns FROM your-table;

Dưới đây là mã ví dụ cho thấy Cách thực hiện cú pháp trên trong php để liệt kê tên của các cột:

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

Để biết chi tiết về đầu ra của SHOW COLUMNS FROM TABLEchuyến thăm: MySQL Chuyển động.


5
Hoặc ... DESC TableName;;-)
double_j

Có cách nào để lưu mảng cho nhiều truy vấn hơn không? Muốn tìm kiếm cơ sở dữ liệu cho $ row [4] để lấy giá trị trong cột thứ năm?
dùng3866044


21

Tôi đã làm điều này trong quá khứ.

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


7

Sử dụng mysql_fetch_field()để xem tất cả dữ liệu cột. Xem hướng dẫn .

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

"Cảnh báo Phần mở rộng này không được chấp nhận kể từ PHP 5.5.0 và sẽ bị xóa trong tương lai."


2
mysqli_num_fields()mysqli_fetch_field_direct()là các phương pháp được cập nhật
Gusstavv Gil

5

Một hàm PHP cũ "mysql_list_fields ()" không được dùng nữa. Vì vậy, ngày nay, cách tốt nhất để có được tên của các trường là truy vấn "HIỂN THỊ MÀU SẮC TỪ tên_bảng [THÍCH 'tên']". Vì vậy, đây là một ví dụ nhỏ:

$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

Không chắc chắn nếu đây là những gì bạn đang tìm kiếm, nhưng điều này làm việc cho tôi:

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

Điều đó trả về một mảng đơn giản của tên cột / tên biến trong bảng hoặc mảng của bạn dưới dạng chuỗi, đó là những gì tôi cần để tự động xây dựng các truy vấn MySQL. Sự thất vọng của tôi là tôi đơn giản là không biết cách lập chỉ mục các mảng trong PHP rất tốt, vì vậy tôi không chắc phải làm gì với kết quả từ DESC hoặc SHOW. Hy vọng câu trả lời của tôi là hữu ích cho người mới bắt đầu như tôi!

Để kiểm tra kết quả: print_r($col_names);


4

khi bạn muốn kiểm tra tất cả cấu trúc bảng của mình với một số tệp thì sử dụng mã này. Trong truy vấn này, tôi chọn cột_name, cột_type và tên_bảng để biết thêm chi tiết. Tôi sử dụng thứ tự của cột_type để tôi có thể nhìn thấy nó dễ dàng.

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

Nếu bạn muốn kiểm tra chỉ nộp hai lần thì bạn có thể thực hiện dễ dàng

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;

nhập mô tả hình ảnh ở đây

nếu bạn muốn kiểm tra trường nào cho phép loại null, v.v. thì bạn có thể sử dụng trường này

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;

nhập mô tả hình ảnh ở đây

bạn muốn kiểm tra thêm thì thik link cũng giúp bạn.

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


Tốt Rất hữu ích.
Sazzad Hissain Khan

3

SHOW COLUMNS trong mysql 5.1 (không phải 5.5) sử dụng bảng đĩa tạm thời.

Vì vậy, nó có thể được coi là chậm đối với một số trường hợp. Ít nhất, nó có thể tăng giá trị created_tmp_disk_tables của bạn . Hãy tưởng tượng một bảng đĩa tạm thời trên mỗi kết nối hoặc mỗi yêu cầu trang.

SHOW COLUMNS không thực sự quá chậm, có thể vì nó sử dụng bộ đệm hệ thống tệp. Phpmyadmin nói ~ 0,5ms liên tục. Điều này không là gì so với 500ms-1000ms phục vụ trang wordpress. Nhưng vẫn có những lúc nó quan trọng. Có sự tham gia của hệ thống đĩa, bạn không bao giờ biết điều gì xảy ra khi máy chủ bận, bộ nhớ cache đầy, hdd bị đình trệ, v.v.

Truy xuất tên cột thông qua CHỌN * TỪ ... GIỚI HẠN 1 là khoảng ~ 0,1ms và nó cũng có thể sử dụng bộ đệm truy vấn.

Vì vậy, đây là mã được tối ưu hóa nhỏ của tôi để lấy tên cột từ một bảng, mà không sử dụng các cột hiển thị nếu có thể:

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

Ghi chú:

  • Miễn là hàng đầu tiên của bảng của bạn không chứa phạm vi dữ liệu megabyte, nó sẽ hoạt động tốt.
  • Tên hàm db_rowsdb_row_ar nên được thay thế bằng thiết lập cơ sở dữ liệu cụ thể của bạn.

Xin chào Johan, tôi gặp lỗi: Gọi hàm không xác định db_row_ar (), khi tôi chạy db_columns_ar ('myTableName');
KarlosFontana

Xin lỗi vì điều đó, tôi sẽ làm rõ nó trong văn bản. Đó là một tên hàm tưởng tượng, đại diện cho bất kỳ lớp cơ sở dữ liệu hoặc thiết lập nào của bạn sử dụng cho loại điều đó.
Johan

3

Hãy thử cái này tôi đích thân sử dụng nó:

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

1
tại sao bạn chỉ chọn tên cột "stock_id" và "Drug_name"?
Frank Bryce

làm việc cho tôi nhưng không có công cụ "ở đâu ...". Với PDO: $ this-> dbHandle = PDO mới (...); $ query = 'HIỂN THỊ MÀU SẮC TỪ'. $ tên bảng; $ stmt = $ this-> dbHandle-> truy vấn ($ truy vấn); $ results = $ stmt-> fetch ALL (PDO :: FETCH_ASSOC); foreach ($ results as $ result) {// làm điều gì đó với mỗi kết quả $}
Zaphoid 17/03/2016

2

TRONG CÔNG VIỆC:

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

2

Câu hỏi này đã cũ, nhưng tôi đã đến đây để tìm cách tìm một truy vấn nhất định cho tên trường của nó theo cách động (không nhất thiết chỉ là các trường của bảng). Và vì mọi người tiếp tục chỉ ra đây là câu trả lời cho nhiệm vụ được đưa ra trong các câu hỏi liên quan khác, tôi chia sẻ cách tôi thấy nó có thể được thực hiện, bằng cách sử dụng các mẹo của 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>";
    }
}

Điều này có thể dễ dàng được sửa đổi để chèn tên trường trong một mảng.

Sử dụng một cách đơn giản: $sql="SELECT * FROM myTable LIMIT 1"có thể cung cấp cho bạn các trường của bất kỳ bảng nào mà không cần sử dụng SHOW COLUMNShoặc bất kỳ mô-đun php bổ sung nào nếu cần (loại bỏ phần kết xuất dữ liệu).

Hy vọng điều này sẽ giúp người khác.


2

nếu bạn sử dụng php, hãy sử dụng ý chính này .

nó có thể nhận các trường chọn đầy đủ thông tin mà không có kết quả và tất cả các trường tùy chỉnh, chẳng hạn như:

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

nếu trên sql trả về không có dữ liệu, cũng sẽ nhận được tên trường aname, bname, b's tên trường khác

chỉ hai dòng:

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

2

Truy vấn này tìm nạp danh sách tất cả các cột trong cơ sở dữ liệu mà không phải chỉ định tên bảng. Nó trả về một danh sách chỉ các tên cột:

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

Tuy nhiên, khi tôi chạy truy vấn này bằng phpmyadmin, nó đã hiển thị một loạt lỗi. Tuy nhiên, nó đã làm việc. Vì vậy, sử dụng nó một cách thận trọng.


2

Giải pháp đơn giản nhất trong số tất cả các Câu trả lời:

DESC `table name`

hoặc là

DESCRIBE `table name`

hoặc là

SHOW COLUMNS FROM `table name`

2

nếu bạn chỉ cần tên và loại trường (có lẽ để dễ dàng sao chép vào Excel):

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

tẩy

DATA_TYPE='decimal'

nếu bạn muốn tất cả các loại dữ liệu


1

Tôi không có chuyên gia, nhưng điều này làm việc cho tôi ..

$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

Tôi đã thử truy vấn này trong SQL Server và điều này hiệu quả với tôi:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.