2013-03-15 3 views
6

테이블에서 auto_increment 열 이름을 가져 오는 방법 (마지막 INSERT ID가 아님)? 예를 들어자동 증가 열 감지

:

create table members (member_id int auto_increment, name char(50), primary key(member_id)); 

나는 테이블 구성원에서 member_id을 얻기 위해 할 수있는 일.

나는 PHP 클래스를 만드는 중이라서, 나는 당신이이 같은이를 얻을 수 있도록하는 방법을 추가하기 위하여려고하고있다 : 그것은 자동 증가 열을 찾을 알고 쿼리를 작성해야

$members->findById(123); 

기반을 그런 다음 쿼리를 수행하십시오.

+0

하지만 삽입 ID를 필요로하지 않는다, 나는 열 이름이 필요합니다. –

+1

다시 투표하려면 다시 투표하십시오. 이 질문은 중복으로 표시되었지만 다른 질문은 다릅니다. –

답변

8

당신은

show columns from members where extra like '%auto_increment%' 

첫 번째 열 Field이 AUTO_INCREMENT 컬럼 이름으로 열을 얻을 수 있습니다.

$sql = "show columns from members where extra like '%auto_increment%'"; 
$sth = $dbh->prepare($sql) or die($dbh->error()); 
$sth->execute() or die($dbh->error()); 
$row = $sth->fetch(); 
$column = $row['Field']; 
+3

왜 downvote? .... 이것은 좋은 답변입니다! – beck03076

0

information_schema를 기반으로 문을 동적으로 준비한 다음 실행해야합니다.

PREPARE stmt FROM concat(
'select * from members where ', 
(select COLUMN_NAME 
    from INFORMATION_SCHEMA.COLUMNS 
    where table_name='members' and EXTRA like '%auto_increment%'), 
    '=?' 
); 
EXECUTE stmt; 
1
SELECT column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = "members" 
AND  extra = "auto_increment"; 

이보십시오!

1

젠드 프레임 워크에서 작업 할 때이 유형의 기능을 Zend_Db 구성 요소의 일부로 구현했습니다. 나는 INFORMATION_SCHEMA에 접근하는 것이 너무 느리다는 것을 알았고 대신 DESCRIBE를 사용해야했습니다. 다음 (하지만 난 그냥 테스트 코드, 젠드 프레임 워크의 일부를 단순화) 같은

뭔가 :

function getAutoIncColumn($table) 
{ 
    global $dbh; 

    $stmt = $dbh->query("DESCRIBE `$table`"); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     if (strstr($row["Extra"], "auto_increment")) { 
     return $row["Field"]; 
     } 
    } 
    return null; 
} 
+0

정보 스키마의 속도 저하 문제는 'set global innodb_stats_on_metadata = 0;' –

+0

@MichaelBenjamin, 그 설정 변수에 대해 알고 있습니다. 그것은 좋은 해결 방법입니다. 그러나 설정되지 않았을 수도 있으며, PHP 응용 프로그램은 전역 변수를 변경하는 데 필요한 SUPER 권한이 없을 수도 있습니다. 이 경우 정보 스키마를 사용하는 질의에 대해서는'set session innodb_stats_on_metadata = 0;'을 –

+0

으로한다. –