web-dev-qa-db-fra.com

Comment obtenir la clé primaire de la table?

Est-il possible d’obtenir le nom du champ de clé primaire à partir de mysql-database? Par exemple:

J'ai une table comme celle-ci:

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

Où l'identifiant de champ est la clé primaire (l'incrémentation est automatique mais je ne peux pas l'utiliser). Comment puis-je récupérer les champs de nom "id" en php?

66
Martti Laine

Un meilleur moyen 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'

Nom_colonne contiendra le nom de la clé primaire.

109
alexn

Voici la clé primaire Nom de colonne

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';
30
Svetlozar Angelov
SELECT key_column_usage.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.
15
Roland Bouman

Que dis-tu de ça.

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';
7
Afroz

utilisation:

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

Si vous voulez générer la liste des clés primaires de manière dynamique via php en une fois sans avoir à parcourir chaque table, 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 à l’information.schema pour le faire.

4
Donal

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";
2
Benoit Vidis

Le code le plus court possible 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']; 
2

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

?>
1
John

J'utilise la table SHOW INDEX FROM; cela me donne beaucoup d'informations; si la clé est unique, sa séquence dans l'index, la collation, la sous-partie, si elle est nulle, son type et le commentaire s'il existe, voir la capture d'écran ici.here

0
user4737789

MySQL a une requête SQL "SHOW INDEX FROM" qui renvoie les index d'une table. Pour par exemple. - la requête suivante affichera tous les index de la table products: -

SHOW INDEXES FROM products \G

Il retourne une table avec le type, nom_colonne, nom_clé, etc. et affiche le résultat avec tous les index et clés primaires sous la forme -

*************************** 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 la table, utilisez: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'
0
priya gupta

Si vous avez des tables spatiales dans votre base de données, utilisez:

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

Vous devez utiliser PRIMARY à partir de key_column_usage.constraint_name = "PRIMARY"

exemple de requête,

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";
0