2013-03-15 4 views
6

Как я могу получить имя столбца auto_increment из таблицы (НЕ ПОСЛЕДНИЙ ИДЕНТИФИКАТОР)?Detect Auto Increment Column

, например:

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

Что я могу сделать, чтобы получить member_id из членов таблицы.

Я делаю класс PHP, и я собираюсь добавить метод, который позволит вам получить это так:

$members->findById(123); 

Он должен знать, чтобы найти столбец автоматического приращения и построения запроса на основе на этом затем выполните запрос.

+0

Но не нужно вставить идентификатор, мне нужно имя столбца. –

+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

Вам нужно будет подготовить инструкцию динамически на основе информационной_схемы, а затем выполнить ее.

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, когда работал над Zend Framework. Я обнаружил, что доступ к INFORMATION_SCHEMA происходит слишком медленно, поэтому мне пришлось использовать DESCRIBE.

-то вроде следующего (но это упрощено код, который я только что испытанный, а не часть Zend Framework):

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, необходимой для изменения глобальных переменных. –

+0

'set session innodb_stats_on_metadata = 0;' для запросов с использованием информационной схемы в этом случае. –