Jak zdobyć klucz podstawowy tabeli?


82

Czy istnieje sposób, aby uzyskać nazwę pola klucza podstawowego z bazy danych mysql? Na przykład:

Mam taki stół:

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

Gdzie id pola to klucz podstawowy (ma automatyczną inkrementację, ale nie mogę tego użyć). Jak mogę pobrać nazwę pola „id” w php?

Odpowiedzi:


136

Lepszym sposobem jest użycie, SHOW KEYSponieważ nie zawsze masz dostęp do information_schema. Następujące prace:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

Nazwa_kolumny będzie zawierać nazwę klucza podstawowego.


1
Dobry pomysł. information_schema jest obsługiwany od wersji MySQL 5.0, ale faktycznie ta metoda działa również w przypadku starszych wersji.
Roland Bouman

28
Czy istnieje sposób na odzyskanie tylko column_nameklucza?
JDelage,

użyj, cutjeśli chcesz uzyskać tylko nazwę kolumny: `| cut -f5`
whoan

34

Oto nazwa kolumny klucza podstawowego

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
tak - to jest jeden sposób. W przypadku MySQL możesz to nawet uprościć, ponieważ constraint_name zawsze będziePRIMARY
Roland Bouman

w ogóle nie poleciłbym tego, to bardzo zasób, wymagający odpowiedzi alexna jest znacznie szybszy
Breezer

tak, to zapytanie zajmuje dużo czasu. To, co zrobiłem, to kolejna tabela z nazwami i identyfikatorami tabel i próbuję pobrać stamtąd, jeśli nie może znaleźć tabeli, więc wykonuje to długie zapytanie i dodaje je do nowej tabeli, działa znacznie szybciej. ale odpowiedź Alexn wydaje się być naprawdę dobra
Shir Gans,

2
Ale to rozwiązanie świetnie sprawdza się w przypadku wielu tabel. (Po prostu wybierz k.nazwa_tabeli, k.nazwa_kolumny, k.pozycja_rządowa).
Mikołaj

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
Po prostu FYI, na sqlserver , constraint_namewygląda UK_entity_name, PK_Users, FK_Users_Contactsitd., Więc nie wydaje się to może być zaufany mieć znaną wartość platformy agnostykiem. 😞
Christian

1
Whoa! Nie spodziewałem się, że go zaktualizujesz. 😅 Oprócz kilku rzeczy działa doskonale! (Zaktualizowałem twoją odpowiedź o poprawki, mam nadzieję, że nie masz nic przeciwko)
Christian

@Christian dziękuje za szybkie działania następcze i korekty. bardzo zobowiązany!
Roland Bouman

7

posługiwać się:

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

7

Co powiesz na to:

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
BŁĄD 1054 (42S22): Nieznana kolumna „db” w „klauzuli gdzie”
zloctb

1
@zloctb: A co ze zmianą nazwy dbprzez TABLE_SCHEMA ...? Nie rozumiem, dlaczego dostałeś +1 za to ...
Ludovic Guillaume

1
To była najjaśniejsza odpowiedź i zadziałała natychmiast.
Betty Mock

5

Jeśli chcesz wygenerować listę kluczy podstawowych dynamicznie za pomocą PHP za jednym razem, bez konieczności przeglądania każdej tabeli, której możesz użyć

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

chociaż musisz mieć dostęp do pliku information.schema, aby to zrobić.


2

W podejściu PHP możesz użyć 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";

tak, dobra sugestia. chociaż ograniczone, jest to wystarczająco dobre dla kluczy primaruy.
Roland Bouman

Pytający powiedział PHP.
arleslie

2

Najkrótszy możliwy kod wygląda na coś takiego

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

Nareszcie to mam!

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

Używam tabeli SHOW INDEX FROM; daje mi wiele informacji; jeśli klucz jest unikalny, jego kolejność w indeksie, sortowanie, część podrzędna, jeśli null, jego typ i komentarz, jeśli istnieje, zobacz zrzut ekranu tutajtutaj


Czy mógłbyś bardziej szczegółowo opisać swoją odpowiedź, dodając więcej opisu rozwiązania, które oferujesz?
abarisone

0

MySQL zawiera zapytanie SQL „SHOW INDEX FROM”, które zwraca indeksy z tabeli. Np. - poniższe zapytanie pokaże wszystkie indeksy tabeli produktów: -

SHOW INDEXES FROM products \G

Zwraca tabelę z typem, nazwą_kolumny, nazwą_klucza itp. I wyświetla dane wyjściowe ze wszystkimi indeksami i kluczami głównymi jako -

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

Aby wyświetlić tylko klucz podstawowy z tabeli, użyj: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'

Rozważ dodanie wyjaśnienia, dlaczego to odpowiada na pierwotne pytanie.
Olivier De Meulder

0

Jeśli masz w swojej bazie danych tabele przestrzenne, użyj:

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

0

Powinieneś użyć PRIMARY from key_column_usage.constraint_name = "PRIMARY"

przykładowe zapytanie,

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

Polecam obejrzenie wszystkich pól

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.