2010-02-26 7 views
44

Existe-t-il un moyen d'obtenir le nom du champ clé primaire de mysql-database? Par exemple:Obtenir la clé primaire de la table?

J'ai une table comme ceci:

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

Lorsque le champ id est la clé primaire (il a incrémentation automatique, mais je ne peux pas l'utiliser). Comment puis-je récupérer les champs nom "id" en php?

Répondre

83

Une meilleure façon est d'utiliser SHOW KEYS puisque vous n'avez pas toujours accès à information_schema. Les travaux suivants:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' 

Column_name contiendra le nom de la clé primaire.

+1

Bonne suggestion. information_schema est supporté depuis MySQL 5.0, mais en effet cette méthode fonctionne aussi pour les versions plus anciennes. –

+17

Existe-t-il un moyen de récupérer uniquement la clé 'column_name'? – JDelage

+0

utilisez 'cut' si vous voulez obtenir juste le nom de la colonne:' | couper -f5' – whoan

20

Voici la colonne de clé primaire Nom

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'; 
+0

oui - c'est une façon.Dans le cas de MySQL, vous pouvez même simplifier cela, car le nom de contrainte sera toujours 'PRIMARY' –

+0

ne le recommanderait pas du tout c'est très exigeant en ressources La réponse d'alexn est beaucoup plus rapide – Breezer

+0

ouais, cette requête prend beaucoup de temps. ce que j'ai fait est une autre table avec des noms de table et des IDs de table et essayant de chercher à partir de là, si elle ne peut pas trouver la table, ainsi elle fait cette requête longue et l'ajoute à la nouvelle table, travaille beaucoup plus rapidement. mais la réponse alexn semble être vraiment bonne aussi –

10
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. 
2

Pour une approche PHP, vous pouvez utiliser 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"; 
+0

yup, bonne suggestion. Bien que limité, c'est un assez bon pour les clés primaruy. –

+0

Le demandeur a dit PHP. – arleslie

1

Je l'ai enfin!

<?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); 
} 
} 

?> 
5

Et à ce sujet.

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

ERREUR 1054 (42S22): Colonne inconnue 'db' dans 'where clause' – zloctb

+0

@zloctb: Qu'en est-il de renommer 'db' avec votre TABLE_SCHEMA ...? Je ne comprends pas pourquoi vous avez obtenu +1 sur ce ... –

+0

C'était la plus claire des réponses et a fonctionné immédiatement pour moi. –

1

Shortest éventuel code semble être quelque chose comme

// $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']; 
5

utilisation:

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

Si vous voulez générer la liste des clés primaires dynamiquement via php en une seule fois, sans avoir à parcourir chaque tableau, vous pouvez utiliser

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

bien que vous ayez besoin d'avoir accès à information.schema pour le faire.

0

J'utilise le tableau SHOW INDEX FROM; ça me donne beaucoup d'informations; si la clé est unique, sa séquence dans l'index, le classement, sous-partie, si null, son type et commentaire s'il existe, voir capture d'écran ici here

+0

Pourriez-vous élaborer davantage votre réponse en ajoutant un peu plus de détails sur la solution que vous fournissez? – abarisone

0

MySQL a une requête SQL "SHOW INDEX FROM" qui renvoie les index d'une table. Par exemple. - la requête suivante affiche tous les index de la table des produits: -

SHOW INDEXES FROM products \G 

Il retourne une table avec le type, nom_colonne, Key_name, etc. et affiche la sortie avec tous les index et les clés primaires comme -

*************************** 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: 

Pour afficher simplement la clé primaire de l'utilisation de la table: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY' 
+0

Envisagez d'ajouter une explication expliquant pourquoi cela répond à la question initiale. –

Questions connexes