如何获取表的主键?


80

有没有办法从mysql数据库获取主键字段的名称?例如:

我有一个这样的表:

+----+------+
| id | name |
+----+------+
| 1  | Foo1 |
| 2  | Foo2 |
| 3  | Foo3 |
+----+------+

其中字段ID是主键(它具有自动递增功能,但我不能使用它)。如何在php中检索字段名称“ id”?

Answers:


133

一种更好的方法是使用,SHOW KEYS因为您并不总是可以访问information_schema。以下作品:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

Column_name将包含主键的名称。


1
好建议。从MySQL 5.0开始支持information_schema,但实际上此方法甚至也适用于较旧的版本。
罗兰·鲍曼

28
有没有办法只检索column_name密钥?
JDelage

使用cut,如果你想只列名:`| cut -f5`
whoan 2016年

34

这是主键列名

SELECT k.column_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
  AND t.table_schema='YourDatabase'
  AND t.table_name='YourTable';

3
是的-这是一种方式。在MySQL情况下,您甚至可以简化此操作,因为constraint_name始终为PRIMARY
Roland Bouman 2010年

根本不会建议这样做,这是非常有资源的,需要alexn的答案要快得多
Breezer 2010年

是的,此查询需要很长时间。我所做的是另一个具有表名和表ID的表,如果找不到该表,则尝试从那里取数据,因此它进行了较长的查询并将其添加到新表中,工作速度更快。但alexn的回答似乎也非常好
Shir Gans

2
但是,该解决方案在处理多个表时效果很好。(只需选择k.table_name,k.column_name,k.ordinal_position)。
克劳斯2014年

21
SELECT kcu.column_name, kcu.ordinal_position
FROM   information_schema.table_constraints tc
INNER JOIN information_schema.key_column_usage kcu
ON     tc.CONSTRAINT_CATALOG = kcu.CONSTRAINT_CATALOG
AND    tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
AND    tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE  tc.table_schema = schema()             -- only look in the current schema
AND    tc.constraint_type = 'PRIMARY KEY'
AND    tc.table_name = '<your-table-name>'    -- specify your table.
ORDER BY kcu.ordinal_position

1
只是一个供参考,在SQLSERVERconstraint_name看起来像UK_entity_namePK_UsersFK_Users_Contacts等等,所以它似乎并不值得信任有一个众所周知的平台无关的值。😞
基督教

@Christian您可以检查更新的声明吗?
罗兰·鲍曼

1
哇!我没想到您会更新它。😅除了几件事,它可以完美运行!(我已通过修复程序为您更新了答案,希望您不要介意)
克里斯蒂安

@Christian感谢堡垒的快速跟进和纠正。多谢!
罗兰·鲍曼

7

这个怎么样:

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'Your Database'
  AND TABLE_NAME = 'Your Table name'
  AND COLUMN_KEY = 'PRI';


SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'Your Database'
  AND TABLE_NAME = 'Your Table name'
  AND COLUMN_KEY = 'UNI';

1
错误1054(42S22):“ where子句”中的未知列“ db”
zloctb

1
@zloctb:如何db通过TABLE_SCHEMA重命名...?我不明白您为什么为此获得+1 ...
Ludovic Guillaume14年

1
这是最清晰的答案,并立即为我工作。
Betty Mock 2014年

6

使用:

show columns from tablename where `Key` = "PRI";

4

如果要一次性通过PHP动态生成主键列表,而不必遍历每个表,则可以使用

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.key_column_usage 
WHERE table_schema = '$database_name' AND CONSTRAINT_NAME = 'PRIMARY' 

尽管您确实需要访问information.schema才能执行此操作。



2

最短的代码似乎是这样的

// $dblink contain database login details 
// $tblName the current table name 
$r = mysqli_fetch_assoc(mysqli_query($dblink, "SHOW KEYS FROM $tblName WHERE Key_name = 'PRIMARY'")); 
$iColName = $r['Column_name']; 

1

终于知道了!

<?php

function mysql_get_prim_key($table){
$sql = "SHOW INDEX FROM $table WHERE Key_name = 'PRIMARY'";
$gp = mysql_query($sql);
$cgp = mysql_num_rows($gp);
if($cgp > 0){
// Note I'm not using a while loop because I never use more than one prim key column
$agp = mysql_fetch_array($gp);
extract($agp);
return($Column_name);
}else{
return(false);
}
}

?>

0

我用SHOW INDEX FROM table; 它给我很多信息; 如果键是唯一的,则它在索引中的顺序,排序规则,子部分(如果为null),类型和注释(如果存在),请参阅此处的屏幕快照这里


您能否详细说明您的答案,并提供有关您提供的解决方案的更多说明?
abarisone 2015年

0

MySQL有一个SQL查询“ SHOW INDEX FROM”,它从表中返回索引。例如。-以下查询将显示产品表的所有索引:-

SHOW INDEXES FROM products \G

它返回类型,column_name,Key_name等的表,并将所有索引和主键的输出显示为-

*************************** 1. row ***************************
        Table: products
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: product_id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 

要仅显示表中的主键,请使用:-

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'

考虑添加一个关于为什么这可以回答原始问题的解释。
Olivier De Meulder '16

0

如果数据库中有空间表,请使用:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' OR Key_name = 'OGR_FID'

0

您应该从以下位置使用PRIMARY key_column_usage.constraint_name = "PRIMARY"

示例查询

SELECT k.column_name as PK, concat(tbl.TABLE_SCHEMA, '.`', tbl.TABLE_NAME, '`') as TABLE_NAME
FROM information_schema.TABLES tbl
JOIN information_schema.key_column_usage k on k.table_name = tbl.table_name
WHERE k.constraint_name='PRIMARY'
  AND tbl.table_schema='MYDB'
  AND tbl.table_type="BASE TABLE";

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.