¿Cómo obtener la clave principal de la mesa?

81

¿Hay alguna manera de obtener el nombre del campo de clave principal de mysql-database? Por ejemplo:

Tengo una mesa como esta:

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

Donde la identificación del campo es la clave principal (tiene incremento automático pero no puedo usar eso). ¿Cómo puedo recuperar el nombre de los campos "id" en php?

Martti Laine
fuente

Respuestas:

135

Una mejor manera es usarlo, SHOW KEYSya que no siempre tiene acceso a information_schema. Los siguientes trabajos:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

Column_name contendrá el nombre de la clave principal.

alexn
fuente
1
Buena sugerencia. information_schema es compatible a partir de MySQL 5.0, pero de hecho este método también funciona para versiones más antiguas.
Roland Bouman
28
¿Hay alguna forma de recuperar solo la column_nameclave?
JDelage
utilice cutsi desea obtener solo el nombre de la columna: `| cut -f5`
whoan
34

Aquí está el nombre de la columna de clave principal

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';
Svetlozar Angelov
fuente
3
sí, esta es una forma. En el caso de MySQL, incluso puede simplificar esto, porque el nombre de restricción siempre seráPRIMARY
Roland Bouman
no lo recomiendo en absoluto que ha muchos recursos que requiere la respuesta de alexn es mucho más rápido
Breezer
sí, esta consulta lleva mucho tiempo. lo que hice fue otra tabla con nombres de tabla e identificadores de tabla y tratando de buscar desde allí, si no puede encontrar la tabla, entonces hace esta consulta larga y la agrega a la nueva tabla, funciona mucho más rápido. pero la respuesta de alexn también parece ser muy buena
Shir Gans
2
Pero esta solución funciona muy bien cuando se trata de varias tablas. (Simplemente seleccione k.table_name, k.column_name, k.ordinal_position).
Claus
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
Roland Bouman
fuente
1
Como digo, en sqlserver , constraint_namese ve como UK_entity_name, PK_Users, FK_Users_Contactsetc., por lo que no parece que pueda ser de confianza para tener un valor independiente de la plataforma conocida. 😞
Christian
1
¡Guau! No esperaba que lo actualizaras. 😅 ¡Aparte de algunas cosas, funciona perfectamente! (Actualicé su respuesta para usted con las correcciones, espero que no le importe)
Christian
@Christian gracias por el rápido seguimiento y corrección. ¡Muy agradecido!
Roland Bouman
7

utilizar:

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

Qué tal esto:

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';
Afroz
fuente
1
ERROR 1054 (42S22): columna desconocida 'db' en 'cláusula where'
zloctb
1
@zloctb: ¿Qué hay de cambiar el nombre dbpor su TABLE_SCHEMA ...? No entiendo por qué obtuviste +1 en esto ...
Ludovic Guillaume
1
Esta fue la más clara de las respuestas y funcionó inmediatamente para mí.
Betty Mock
5

Si desea generar la lista de claves primarias dinámicamente a través de PHP de una vez sin tener que ejecutar cada tabla, puede usar

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

aunque es necesario tener acceso a information.schema para hacer esto.

Donal
fuente
2

Para un enfoque de PHP, puede usar 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";
Benoit Vidis
fuente
sí, buena sugerencia. aunque limitado, esto es lo suficientemente bueno para las teclas primaruy.
Roland Bouman
El autor de la pregunta dijo PHP.
arleslie
2

El código más corto posible parece ser algo así como

// $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']; 
K. Kilian Lindberg
fuente
1

¡Lo tengo, finalmente!

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

?>
John
fuente
0

Yo utilizo SHOW INDEX FROM table; me da mucha información; si la clave es única, su secuencia en el índice, la colación, la subparte, si es nula, su tipo y comentario si existe, vea la captura de pantalla aquíaquí


fuente
¿Podría elaborar más su respuesta agregando un poco más de descripción sobre la solución que proporciona?
abarisone
0

MySQL tiene una consulta SQL "SHOW INDEX FROM" que devuelve los índices de una tabla. Por ej. - la siguiente consulta mostrará todos los índices de la tabla de productos: -

SHOW INDEXES FROM products \G

Devuelve una tabla con tipo, column_name, Key_name, etc. y muestra la salida con todos los índices y claves primarias como -

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

Para mostrar la clave principal de la tabla, use: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'
priya gupta
fuente
Considere agregar una explicación de por qué esto responde a la pregunta original.
Olivier De Meulder
0

Si tiene tablas espaciales en su base de datos, use:

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

Debe utilizar PRIMARY de key_column_usage.constraint_name = "PRIMARY"

consulta de muestra,

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";
Mohideen bin Mohammed
fuente
0
SELECT k.column_name
FROM information_schema.key_column_usage k   
WHERE k.table_name = 'YOUR TABLE NAME' AND k.constraint_name LIKE 'pk%'

Te recomiendo que mires todos los campos

P Satish Patro
fuente