¿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?

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.


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

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

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

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

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.


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

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

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

?>

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í


¿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'

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'

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.