如何从 mysql 表中获取自动递增字段名称或主键字段名称?

Posted

技术标签:

【中文标题】如何从 mysql 表中获取自动递增字段名称或主键字段名称?【英文标题】:How can I get the auto incrementing field name or the primary key fieldname from a mysql table? 【发布时间】:2012-06-21 01:27:03 【问题描述】:

php 中,如何获取已设置为在添加新记录时自动递增的字段的字段名称?

在大多数情况下,它与表的 PRIMARY_KEY 相同,但不一定总是如此。

所以这个问题有 2 个部分,第二个部分分为第三部分。

1-如何获取自增字段名...

2-如何获取primary_key字段名...

2.1 表使用多个字段作为主键时如何获取primary_key(s)信息...

【问题讨论】:

【参考方案1】:

如果要获取表的主键列,可以使用这段代码:

SELECT k.COLUMN_NAME
FROM information_schema.table_constraints t
LEFT JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
    AND t.table_schema=DATABASE() 
    AND t.table_name='tbName';    -- the name of your table

要获取自动递增的字段,请尝试以下操作:

SELECT Auto_increment 
FROM information_schema.tables 
WHERE table_name   = 'tbName'  
  AND table_schema = DATABASE();  

【讨论】:

查询information_schema表时,使用innodb_stats_on_metadata=0可以获得更好的性能:percona.com/blog/2011/12/23/solving-information_schema-slowness 返回auto_increment列名的语句实际上返回了auto_increment值,因此没有回答问题。【参考方案2】:

您可以使用SHOW COLUMNS FROM table 获取表信息。像这样的:

$res = $mysqli->query('SHOW COLUMNS FROM tablename');

while($row = $res->fetch_assoc()) 
  if ($row['Extra'] == 'auto_increment')
    echo 'Field with auto_increment = '.$row['Field'];
  if ($row['Key'] == 'PRI')
    echo 'Field with primary key = '.$row['Field'];

【讨论】:

显示 Extra='auto_increment' 的表名中的列【参考方案3】:

可以查询information_schema数据库:

SELECT column_name, column_key, extra 
FROM information_schema.columns 
WHERE table_schema=DATABASE() AND table_name='tablename';
column_key 将由密钥类型组成,即PRIMUL 等。 extra 列将包含 auto_increment 用于自动增量列。

请注意,information_schema 数据库是“全局”的,因此您必须始终传递相应的数据库(具体地或通过 DATABASE() 用于当前数据库)表,否则您最终会得到一个大的结果集。

【讨论】:

【参考方案4】:

您可以使用SHOW COLUMNS 命令获取这些信息。 More info

示例:假设您有一个名为 City 的表。查看表属性的查询是:

mysql> SHOW COLUMNS FROM City;

...And the result:
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| Id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name       | char(35) | NO   |     |         |                |
| Country    | char(3)  | NO   | UNI |         |                |
| District   | char(20) | YES  | MUL |         |                |
| Population | int(11)  | NO   |     | 0       |                |
+------------+----------+------+-----+---------+----------------+

这是来自http://dev.mysql.com/doc/refman/5.0/en/show-columns.html

【讨论】:

如果您实际上包含了获取 OP 要求的信息的命令,我会赞成这个答案。

以上是关于如何从 mysql 表中获取自动递增字段名称或主键字段名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何让mysql的自动递增的字段重新从1开始

如何才能让mysql自动递增的字段重新从1开始呢

PHP mySQL - 将新记录插入表中,主键自动递增

如何使用某些前缀使 MySQL 表主键自动递增

MySQL phpMyAdmin 从文本导入而没有主键?

当主键列是mysql中不同表的外键时,如何将主键列更改为自动递增