有没有办法从mysql-database获取主键字段的名称?例如:获取表的主键?
我有这样的一个表:
+----+------+
| id | name |
+----+------+
| 1 | Foo1 |
| 2 | Foo2 |
| 3 | Foo3 |
+----+------+
凡id字段是主键(它有自动递增,但我不能使用)。我如何检索字段名称“身份证”在PHP?
有没有办法从mysql-database获取主键字段的名称?例如:获取表的主键?
我有这样的一个表:
+----+------+
| id | name |
+----+------+
| 1 | Foo1 |
| 2 | Foo2 |
| 3 | Foo3 |
+----+------+
凡id字段是主键(它有自动递增,但我不能使用)。我如何检索字段名称“身份证”在PHP?
一个更好的办法是使用SHOW KEYS
因为你并不总是有访问INFORMATION_SCHEMA。以下作品:
SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'
COLUMN_NAME将包含主键的名称。
这里是主键列名
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';
是 - 这是一种方式。在MySQL的情况下,你甚至可以简化这个,因为constraint_name命令将永远是'PRIMARY' – 2010-02-26 11:53:12
难道不推荐这在所有它是非常耗费资源,需要 alexn的答案是远远快 – Breezer 2010-11-02 13:20:59
是啊,这个查询需要较长的时间。我所做的是用表名和表ID,并试图从那里获取,如果它不能找到表另一个表,所以它使这一长期的查询,并将其添加到新表,工作要快得多。但alexn答案似乎是真的好太多 – 2011-02-22 09:00:13
SELECT kcu.column_name
FROM information_schema.key_column_usage
WHERE table_schema = schema() -- only look in the current db
AND constraint_name = 'PRIMARY' -- always 'PRIMARY' for PRIMARY KEY constraints
AND table_name = '<your-table-name>' -- specify your table.
对于PHP的方法,你可以使用mysql_field_flags
$q = mysql_query('select * from table limit 1');
for($i = 0; $i < mysql_num_fields(); $i++)
if(strpos(mysql_field_tags($q, $i), 'primary_key') !== false)
echo mysql_field_name($q, $i)." is a primary key\n";
是,好建议。虽然是有限的,但这对于初级密钥来说已经足够了。 – 2010-02-26 12:29:43
提问者确实说过PHP。 – arleslie 2014-06-22 05:28:57
我找到了,终于来了!
<?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);
}
}
?>
这个怎么样。
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';
ERROR 1054(42S22):在 'where子句' – zloctb 2014-04-21 16:29:15
@zloctb未知列 'DB':有关重命名'你TABLE_SCHEMA db'什么...?我不明白你为什么得到+1 ... – 2014-11-28 10:24:05
这是最清晰的答案,并立即为我工作。 – 2014-12-29 17:50:53
最短的代码似乎是这样的
// $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'];
使用:
show columns from tablename where `Key` = "PRI";
如果你想通过PHP一气呵成动态生成主键的列表,而不必贯穿您可以使用的每张桌子
SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.key_column_usage WHERE table_schema = '$database_name' AND CONSTRAINT_NAME = 'PRIMARY'
虽然你确实需要访问该information.schema做到这一点。
我用SHOW INDEX FROM表;它给了我很多信息的;如果密钥是唯一的,则它在索引中的后缀,归类,子部分,如果为null,则其类型和注释(如果存在),请参见此处的截图
您能否详细说明您的答案,并增加关于您提供的解决方案的更多描述? – abarisone 2015-04-10 11:39:42
MySQL有一个SQL查询“SHOW INDEX FROM”从表中。 例如。 - 下面的查询将显示为产品表的所有索引: -
SHOW INDEXES FROM products \G
它返回一个表型,列名,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'
考虑添加一个解释,为什么这会回答原来的问题。 – 2016-04-18 12:56:14
好的建议。 information_schema从MySQL 5.0开始支持,但实际上这种方法也适用于更旧的版本。 – 2010-02-26 12:30:31
有没有办法只能检索'column_name'关键? – JDelage 2012-02-14 20:26:58
使用'cut'如果你想获得刚刚列名:'|切-f5' – whoan 2016-07-19 14:12:31