2013-03-15 79 views
6

如何从表(不是最后一个插入ID)获取auto_increment列名?检测自动增量列

例如:

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

我能做些什么,从表中成员获得member_id

我想提出一个PHP类,并且我要补充一点,可以让你得到这个像这样的方法:

$members->findById(123); 

应该知道找到自动递增列,并建立一个基于查询的然后做这个查询。

+0

但我并不需要插入ID,我需要的列名。 – 2013-03-15 22:01:56

+1

投票重新开放。这个问题被标记为重复,但另一个问题是不同的。 – 2013-03-16 06:32:34

回答

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 2013-03-15 22:15:41

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 Framework上工作时,将这种类型的函数实现为Zend_Db组件的一部分。我发现访问INFORMATION_SCHEMA的速度太慢,所以我不得不使用DESCRIBE。

类似下面的(但这是简化代码,我只是测试,没有Zend框架的一部分):

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;' – 2013-03-15 22:23:26

+0

@MichaelBenjamin,谢谢我对该配置变量的了解。这是一个很好的解决方法。但它可能没有设置,并且PHP应用程序可能没有SUPER权限来更改全局变量。 – 2013-03-15 22:26:13

+0

'set session innodb_stats_on_metadata = 0;'在这种情况下使用信息模式进行查询。 – 2013-03-15 22:27:04