Wie bekomme ich den Primärschlüssel der Tabelle?

81

Gibt es eine Möglichkeit, den Namen des Primärschlüsselfelds aus der MySQL-Datenbank abzurufen? Zum Beispiel:

Ich habe einen Tisch wie diesen:

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

Wo die Feld-ID der Primärschlüssel ist (sie hat eine automatische Inkrementierung, aber ich kann das nicht verwenden). Wie kann ich den Feldnamen "id" in PHP abrufen?

Martti Laine
quelle

Antworten:

134

Eine bessere Möglichkeit ist die Verwendung, SHOW KEYSda Sie nicht immer Zugriff auf information_schema haben. Folgendes funktioniert:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

Spaltenname enthält den Namen des Primärschlüssels.

alexn
quelle
1
Guter Vorschlag. information_schema wird ab MySQL 5.0 unterstützt, aber diese Methode funktioniert auch für ältere Versionen.
Roland Bouman
28
Gibt es eine Möglichkeit, nur den column_nameSchlüssel abzurufen ?
JDelage
Verwenden cutSie diese Option, wenn Sie nur den Spaltennamen erhalten möchten: `| cut -f5`
whoan
34

Hier ist der Spaltenname des Primärschlüssels

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
quelle
3
Ja, das ist eine Möglichkeit. Im MySQL-Fall können Sie dies sogar vereinfachen, da der Einschränkungsname immerPRIMARY
Roland Bouman
Ich würde das überhaupt nicht empfehlen, es ist sehr ressourcenschonend. Alexns Antwort ist viel schneller
Breezer
Ja, diese Abfrage dauert lange. Was ich getan habe, ist eine andere Tabelle mit Tabellennamen und Tabellen-IDs und der Versuch, von dort abzurufen, wenn sie die Tabelle nicht finden kann, so dass diese lange Abfrage und das Hinzufügen zur neuen Tabelle viel schneller funktioniert. Aber Alexn Antwort scheint auch wirklich gut zu sein
Shir Gans
2
Diese Lösung funktioniert jedoch hervorragend, wenn mehrere Tabellen verarbeitet werden. (Wählen Sie einfach 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
quelle
1
Nur ein FYI, auf sqlserver , constraint_namesieht aus wie UK_entity_name, PK_Users, FK_Users_Contactsusw., so dass es scheint nicht vertraut werden kann , einen bekannten Plattform-Agnostiker Wert zu haben. 😞
Christian
@Christian Könnten Sie die aktualisierte Anweisung überprüfen?
Roland Bouman
1
Whoa! Ich habe nicht erwartet, dass Sie es aktualisieren. 😅 Abgesehen von ein paar Dingen funktioniert es perfekt! (Ich habe Ihre Antwort für Sie mit den Korrekturen aktualisiert, hoffe es macht Ihnen nichts aus)
Christian
@ Christian danke für die schnelle Nachverfolgung und Korrektur. Herzlichen Dank!
Roland Bouman
7

verwenden:

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

Wie wäre es damit:

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
quelle
1
FEHLER 1054 (42S22): Unbekannte Spalte 'db' in 'where-Klausel'
zloctb
1
@zloctb: Was ist mit dem Umbenennen dbdurch dein TABLE_SCHEMA ...? Ich verstehe nicht, warum du +1 dafür bekommen hast ...
Ludovic Guillaume
1
Dies war die klarste Antwort und funktionierte sofort für mich.
Betty Mock
5

Wenn Sie die Liste der Primärschlüssel dynamisch über PHP auf einmal generieren möchten, ohne jede Tabelle durchlaufen zu müssen, die Sie verwenden können

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

Sie müssen jedoch Zugriff auf das information.schema haben, um dies zu tun.

Donal
quelle
2

Für einen PHP-Ansatz können Sie mysql_field_flags verwenden

$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
quelle
Ja, guter Vorschlag. Obwohl begrenzt, ist dies gut genug für die Primaruy-Schlüssel.
Roland Bouman
Der Fragesteller hat PHP gesagt.
Arleslie
2

Der kürzestmögliche Code scheint so etwas wie zu sein

// $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
quelle
1

Ich habe es endlich!

<?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
quelle
0

Ich benutze SHOW INDEX FROM Tabelle; es gibt mir viele Informationen; Wenn der Schlüssel eindeutig ist, seine Reihenfolge im Index, die Sortierung, der Unterteil, falls null, sein Typ und sein Kommentar, falls vorhanden, siehe Screenshot hierHier


quelle
Könnten Sie bitte Ihre Antwort näher erläutern und etwas mehr Beschreibung der von Ihnen angebotenen Lösung hinzufügen?
Abarisone
0

MySQL hat eine SQL-Abfrage "SHOW INDEX FROM", die die Indizes aus einer Tabelle zurückgibt. Zum Beispiel. - Die folgende Abfrage zeigt alle Indizes für die Produkttabelle an: -

SHOW INDEXES FROM products \G

Es gibt eine Tabelle mit Typ, Spaltenname, Schlüsselname usw. zurück und zeigt die Ausgabe mit allen Indizes und Primärschlüsseln als - an

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

Um nur den Primärschlüssel aus der Tabelle anzuzeigen, verwenden Sie: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'
Priya Gupta
quelle
Fügen Sie eine Erklärung hinzu, warum dies die ursprüngliche Frage beantwortet.
Olivier De Meulder
0

Wenn Ihre Datenbank räumliche Tabellen enthält, verwenden Sie:

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

Sie sollten PRIMARY von verwenden key_column_usage.constraint_name = "PRIMARY"

Beispielabfrage,

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
quelle
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%'

Ich würde Ihnen empfehlen, alle Felder zu beobachten

P Satish Patro
quelle