열 이름을 얻는 MySQL 쿼리?


286

PHP에서 모든 mysql 테이블의 col 이름을 배열로 가져오고 싶습니다.

이것에 대한 질문이 있습니까?

답변:


513

가장 좋은 방법은 INFORMATION_SCHEMA 메타 데이터 가상 데이터베이스 를 사용하는 것 입니다. 특히 INFORMATION_SCHEMA.COLUMNS 테이블 ...

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

매우 강력하며 텍스트를 구문 분석 할 필요없이 정보의 톤을 제공 할 수 있습니다 (열 유형과 같이 열이 nullable인지, 최대 열 크기, 문자 집합 등) ...

아, 그리고 그것은 표준 SQL입니다 ( SHOW ...MySQL 전용 확장 프로그램 인 반면 ) ...

테이블 SHOW...INFORMATION_SCHEMA테이블 의 차이점에 대한 자세한 내용은 일반적으로 MySQL 설명서를 참조하십시오INFORMATION_SCHEMA ...


27
테이블 이름을 인용하기 위해 바보 같은 mysql 관련 백틱을 사용하지 않는 경우에만 표준 SQL입니다. 나는 그들을 싫어, 그들은 내 코드를 잘못 보이게합니다.
MarkR

17
@ MarkR 나는 실제로 답을 쓸 때 원래 포함하지 않았습니다. 그러나 그것은 단지 검은 글씨의 벽처럼 보였다. 구문 강조를 활용하기 위해 백틱을 추가했습니다. 예, 나도 미리 가질 수 SET @@SESSION.sql_mode = 'ANSI_QUOTES';있었지만 정말 마음에 들지 않습니다. 그리고 식별자 구분을위한 백 틱에 문제가 없습니다. 사실, 그들처럼 내가 더 나은 따옴표보다는 ... 각각 자신에 ... (큰 따옴표 나에게 질의 느낌의 잘못을 만든다)
ircmaxell

2
위의 예에서는 테이블 이름을 인용 할 필요가 없습니다.
MarkR

20
@MarkR 나는 그렇지 않다는 것을 안다. 그렇기 때문에 원래 답변을 쓸 때 실제로 포함하지 않았다고 말했습니다 . 나는 구문 강조를 활용하기 위해 그것들을 추가했습니다 ...
ircmaxell

4
InnodDB 테이블을 사용하면 information_schema에서 선택하면 매우 느려질 수 있습니다. 일부 서버에서 1 분 이상
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
Or ... DESC TableName;;-)
double_j

더 많은 쿼리를 위해 배열을 저장하는 방법이 있습니까? 다섯 번째 열의 값을 얻기 위해 $ row [4]에 대한 데이터베이스를 검색 하시겠습니까?
user3866044


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()업데이트 방법이 있습니다
Gusstavv 길

5

오래된 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; }

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

일부 테이블 구조로 모든 테이블 구조를 확인하려면이 코드를 사용하십시오. 이 쿼리에서 자세한 내용을 보려면 column_name, column_type 및 table_name을 선택하십시오. column_type으로 order를 사용하므로 쉽게 볼 수 있습니다.

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;

여기에 이미지 설명을 입력하십시오

더 많은 것을 확인하고 싶다면 thik link도 도움이됩니다.

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


좋은. 매우 도움이됩니다.
Sazzad Hissain Khan

3

mysql 5.1 (5.5 아님)의 SHOW COLUMNS 는 임시 디스크 테이블을 사용합니다.

따라서 경우에 따라 느리게 간주 될 수 있습니다. 최소한 created_tmp_disk_tables 값을 올릴 수 있습니다 . 연결 당 또는 각 페이지 요청 당 하나의 임시 디스크 테이블을 상상해보십시오.

SHOW COLUMNS 는 파일 시스템 캐시를 사용하기 때문에 속도가 느리지 않습니다. Phpmyadmin은 ~ 0.5ms를 일관되게 말합니다. 이것은 500ms-1000ms의 워드 프레스 페이지를 제공하는 것과 비교할만한 것은 아닙니다. 그러나 여전히 중요한시기가 있습니다. 디스크 시스템 관련이 있으며 서버가 사용 중이거나 캐시가 가득 찼거나 hdd가 멈췄을 때 어떤 일이 발생하는지 알 수 없습니다.

SELECT * FROM ... LIMIT 1을 통한 열 이름 검색 은 ~ 0.1ms 정도였으며 쿼리 캐시도 사용할 수 있습니다.

따라서 가능한 경우 show columns 를 사용하지 않고 테이블에서 열 이름을 가져 오는 최적화 된 코드는 다음과 같습니다.

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_rowsdb_row_ar 는 특정 데이터베이스 설정으로 바꿔야합니다.

안녕 요한, 오류가 발생합니다 : db_columns_ar ( 'myTableName')을 실행할 때 정의되지 않은 함수 db_row_ar ()를 호출합니다.
KarlosFontana

죄송합니다. 텍스트로 명확하게 설명하겠습니다. 이는 데이터베이스 클래스 나 설정이 해당 유형의 항목에 사용하는 모든 것을 나타내는 가상 함수 이름입니다.
Johan

3

개인적으로 사용하는 것이 좋습니다.

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

1
"stock_id"및 "drug_name"열 이름 만 선택하는 이유는 무엇입니까?
Frank Bryce

나를 위해 일했지만 "where ..."가없는 것. PDO의 경우 : $ this-> dbHandle = new PDO (...); $ query = 'SHOW COLUMNS FROM'. $ tableName; $ stmt = $ this-> dbHandle-> query ($ query); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ results는 $ result로 결과) {// 각 $ result로 무언가 수행}
Zaphoid

2

WORDPRESS에서 :

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

2

이 질문은 오래되었지만 여기서는 주어진 쿼리에 필드 이름을 동적으로 (테이블의 필드 만이 아니라) 찾는 방법을 찾고있었습니다. 사람들은 이것을 다른 관련 질문에서 주어진 작업에 대한 답변으로 계속 지적하기 때문에 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>";
    }
}

필드 이름을 배열에 삽입하기 위해 쉽게 수정할 수 있습니다.

간단한 사용 : 필요한 경우 추가 PHP 모듈 $sql="SELECT * FROM myTable LIMIT 1"을 사용하지 않고도 테이블의 필드를 제공 할 수 있습니다 SHOW COLUMNS(데이터 덤프 부분 제거).

잘하면 이것은 다른 누군가를 돕습니다.


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')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.