Konfigurujesz klucze obce w phpMyAdmin?

335

Konfiguruję bazę danych przy użyciu phpMyAdmin. Mam dwie tabele ( fooi bar), indeksowane na kluczach podstawowych . Próbuję utworzyć relacyjną tabelę ( foo_bar) między nimi, używając ich kluczy podstawowych jako kluczy obcych.

Te tabele utworzyłem jako MyISAM, ale od tego czasu zmieniłem wszystkie trzy na InnoDB, ponieważ przeczytałem, że MyISAM nie obsługuje kluczy obcych. Wszystkie idpola są INT(11).

Kiedy wybrać foo_bartabelę, kliknij „Widok relacyjny” link i spróbuj ustawić kolumny FK być database.foo.idi database.bar.idto mówi „No indeks zdefiniowany!” obok każdej kolumny.

czego mi brakuje?

Wyjaśnienie / aktualizacja

Dla uproszczenia chcę nadal używać phpMyAdmin. Obecnie używam XAMPP, co pozwala mi skupić się na PHP / CSS / JavaScript i zawiera phpMyAdmin.

Ponadto, chociaż nie byłem jeszcze w stanie skonfigurować jawnych kluczy obcych, mam tabelę relacyjną i mogę wykonywać połączenia w następujący sposób:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

To po prostu sprawia, że ​​czuję się niekomfortowo, gdy nie mam wyraźnie zdefiniowanych FK w bazie danych.

Nathan Long
źródło

Odpowiedzi:

365

Jeśli chcesz użyć phpMyAdmina do skonfigurowania relacji, musisz zrobić 2 rzeczy. Przede wszystkim musisz zdefiniować indeks w kolumnie klucza obcego w tabeli odsyłającej (więc w twoim przypadku foo_bar.foo_id). Następnie przejdź do widoku relacji (w tabeli odsyłającej) i wybierz kolumnę, do której się odwołujesz (więc w twoim przypadku foo.id) oraz działania dotyczące aktualizacji i usuwania.

Myślę, że klucze obce są przydatne, jeśli masz wiele tabel połączonych ze sobą, w szczególności skrypty usuwania staną się bardzo krótkie, jeśli poprawnie ustawisz opcje odwoływania się.

EDYCJA: Upewnij się, że w obu tabelach wybrano silnik InnoDB.

rael_kid
źródło
93
Wskazówka: widok relacji to mały link pod twoim stołem, ciężko mi było go znaleźć
Mladen Janjetovic
14
Chyba że ten link się tam nie pokazuje, w takim przypadku: Upewnij się, że twoja tabela jest typu InnoDB (na karcie Operacje w phpMyAdmin), aby tak się nie stało.
muttley91
4
@ muttley91 Moja tabela to InnoDB. Sprawdziłem dwukrotnie. Link nadal się nie wyświetla.
afilina
6
@afilina W nowej wersji phpMyAdmina jest on widoczny u góry wewnątrz zakładki „Struktura”, tuż pod wierszem zakładki, która pokazuje „Przeglądaj”, „Struktura” itp.
Astitva Srivastava
225

phpMyAdmin pozwala definiować klucze obce przy użyciu ich widoku „relacji”. Ponieważ jednak MySQL obsługuje tylko ograniczenia obce dla tabel „INNO DB”, pierwszym krokiem jest upewnienie się, że tabele, których używasz, są tego typu.

Aby skonfigurować klucz obcy, aby kolumna PID w tabeli o nazwie CHILD odwoływała się do kolumny identyfikatora w tabeli o nazwie PARENT, możesz wykonać następujące czynności:

  1. W przypadku obu tabel przejdź do karty operacji i zmień ich typ na „INNO DB”
  2. Upewnij się, że identyfikator jest kluczem podstawowym (lub przynajmniej indeksowaną kolumną) tabeli PARENT.
  3. W tabeli CHILD zdefiniuj indeks dla kolumny PID.
  4. Przeglądając kartę struktury tabeli DZIECKO, kliknij link „widok relacji” tuż nad sekcją „dodaj pola”.
  5. Otrzymasz tabelę, w której każdy wiersz odpowiada indeksowanej kolumnie w tabeli KLIENTA. Pierwsza lista rozwijana w każdym wierszu pozwala wybrać, który TABELA-> KOLUMNA odwołuje się do indeksowanych kolumn. W wierszu dotyczącym PID wybierz z menu rozwijanego PARENT-> ID i kliknij GO.

Wykonując eksport do tabeli CHILD, powinieneś zobaczyć ograniczenie klucza obcego dla kolumny PID.

oczekuje
źródło
2
Wow, bardzo ważna rzecz do zapamiętania. Ta strona nie była pierwszą rzeczą, którą znalazłem, kiedy szukałem pomocy przy dodawaniu klucza obcego. Chciałbym, aby była o tym częściej wspominana.
user1299656
86

To jest streszczenie artykułu z Wikipedii. Określa różne typy relacji, które można ustalić w PHPmyadmin. Umieszczam go tutaj, ponieważ ma on związek z komentarzem @ Nathana dotyczącym ustawiania opcji kluczy obcych dla opcji „podczas aktualizacji / usuwania”, ale jest zbyt duży, aby mógł zostać skomentowany - mam nadzieję, że to pomoże.

KASKADA

Za każdym razem, gdy wiersze w tabeli głównej (odniesienia) zostaną usunięte (odpowiednio zaktualizowane), odpowiednie wiersze tabeli potomnej (odniesienia) z pasującą kolumną klucza obcego również zostaną usunięte (odpowiednio zaktualizowane). Nazywa się to kasowaniem kaskadowym (odpowiednio aktualizacja [2]).

OGRANICZAĆ

Wartości nie można aktualizować ani usuwać, gdy istnieje wiersz w tabeli kluczy obcych, który odwołuje się do wartości w tabeli, do której istnieje odwołanie. Podobnie, wiersz nie może zostać usunięty, dopóki istnieje odwołanie do niego z tabeli kluczy obcych.

BEZ AKCJI

ŻADNE DZIAŁANIE i OGRANICZENIE są bardzo podobne. Główną różnicą między BRAK DZIAŁANIA a OGRANICZENIEM jest to, że przy BRAKU DZIAŁANIA sprawdzanie integralności referencyjnej odbywa się po próbie zmiany tabeli. Funkcja RESTRICT wykonuje sprawdzenie przed próbą wykonania instrukcji UPDATE lub DELETE. Obie akcje referencyjne działają tak samo, jeśli sprawdzenie integralności referencyjnej zakończy się niepowodzeniem: instrukcja UPDATE lub DELETE spowoduje błąd.

ZESTAW NULL

Wartości klucza obcego w wierszu odniesienia są ustawiane na NULL, gdy wiersz odniesienia jest aktualizowany lub usuwany. Jest to możliwe tylko wtedy, gdy odpowiednie kolumny w tabeli odwołań są zerowalne. Ze względu na semantykę wartości NULL wiersz odniesienia z wartościami NULL w kolumnach klucza obcego nie wymaga wiersza odniesienia.

USTAW DOMYŚLNIE

Podobnie jak w przypadku ustawienia NULL, wartości klucza obcego w wierszu odniesienia są ustawiane na wartość domyślną kolumny, gdy wiersz odniesienia jest aktualizowany lub usuwany.

Brett
źródło
1
Jeszcze lepiej, przejdź bezpośrednio do dokumentacji źródłowej MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser
62

W phpmyadmin możesz przypisać klucz obcy po prostu przez jego GUI. Kliknij tabelę i przejdź do zakładki Struktura. znajdź widok relacji na poniższej tabeli (pokazany na poniższym obrazku).

wprowadź opis zdjęcia tutaj

Możesz przypisać klucz do kucia z pola listy obok klucza głównego (patrz obrazek poniżej). i zapisz

wprowadź opis zdjęcia tutaj

odpowiednie zapytanie SQL wygenerowane i wykonane automatycznie.

Nishad Up
źródło
16

Dla tych, którzy są nowi w bazie danych ... i muszą ZMIENIĆ istniejącą tabelę. Wiele rzeczy wydaje się być bardzo prostych, ale zawsze jest coś ... między A i B.

Przede wszystkim spójrz na to .

  1. Upewnij się, że masz P_ID (identyfikator rodzica w tabeli nadrzędnej i podrzędnej).
  2. Oczywiście będzie już wypełniony rodzic. Niekoniecznie w dziecku w prawdziwy i ostateczny sposób. Na przykład P_ID # 3 (może wiele razy w tabeli podrzędnej będzie wskazywał oryginalny P_ID w tabeli nadrzędnej).
  3. Przejdź do karty SQL (używam phpMyAdmin, powinien być podobny w innych) i wykonaj następujące polecenie:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Kliknij tabelę podrzędną, a nie strukturę, a na końcu widok relacyjny. Zakończ tam planowanie DB. Przed tym była ładna odpowiedź na temat kaskady, ograniczenia itp. Oczywiście można to zrobić za pomocą poleceń ...

użytkownik2060451
źródło
9

Klucz obcy oznacza, że ​​nie-główny atrybut tabeli odnosi się do atrybutu pierwszego innego * w phpMyAdmin * najpierw ustaw kolumnę, którą chcesz ustawić klucz obcy jako indeks

następnie kliknij WIDOK RELACJI

możesz znaleźć opcje ustawienia klucza obcego

Shafeeq M. kunjumoideen
źródło
7

InnoDB umożliwia dodanie nowego ograniczenia klucza obcego do tabeli za pomocą ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

Z drugiej strony, jeśli MyISAM ma przewagę nad InnoDB w twoim kontekście, dlaczego w ogóle chcesz tworzyć ograniczenia dla klucza obcego. Możesz sobie z tym poradzić na poziomie aplikacji. Upewnij się tylko, że kolumny, których chcesz użyć jako kluczy obcych, są indeksowane!

markus
źródło
4
Ograniczenia klucza obcego oszczędzają mi dużo wysiłku i potencjalnych błędów. Powiedzmy na przykład, że usunę użytkownika z mojego systemu. Mógłbym napisać kod określający każde miejsce w bazie danych, w którym istnieją dane o tym użytkowniku, i nakazać mu usunięcie. Ale muszę zawsze aktualizować tę funkcję usuwania. Z drugiej strony, jeśli wszystkie dane użytkownika mają FK w identyfikatorze użytkownika i ustawiono kaskadowe usuwanie, cały mój kod musi powiedzieć „usuń tego użytkownika”, a baza danych zajmie się usunięciem wszystkiego, co ma odniesienie FK do tego użytkownika. Dużo czystszy w utrzymaniu.
Nathan Long,
1
@Nathan: Tak mówię w poście. Możesz sobie z tym poradzić również na poziomie modelu. Możesz zaimplementować kaskadę usuwania z modelu.
markus
3
Prawie zawsze dodajesz integralność referencyjną do tabel bazy danych. Baza danych powinna chronić się przed złym programowaniem aplikacji. Nie należy polegać wyłącznie na aplikacji, aby zachować integralność danych. Oczywiście zawsze są wyjątki od każdej reguły, ale nie znalazłem dla tego jednego.
Harv
4

Nie zapominaj, że dwie kolumny powinny mieć ten sam typ danych.

na przykład, jeśli jedna kolumna jest typu INT, a druga jest typu tinyint, pojawi się następujący błąd:

Błąd podczas tworzenia klucza obcego w [kolumnie PID] (sprawdź typy danych)

pouya
źródło
3

Krok 1: Musisz dodać wiersz: default-storage-engine = InnoDB w sekcji [mysqld] pliku konfiguracyjnego mysql (my.cnf lub my.ini w zależności od systemu operacyjnego) i zrestartuj usługę mysqld. wprowadź opis zdjęcia tutaj

Krok 2: Teraz podczas tworzenia tabeli zobaczysz typ tabeli: InnoDB

wprowadź opis zdjęcia tutaj

Krok 3: Utwórz tabelę nadrzędną i podrzędną. Teraz otwórz tabelę potomną i wybierz kolumnę U, jak chcesz mieć klucz obcy: Wybierz klucz indeksu z etykiety czynności, jak pokazano poniżej.

wprowadź opis zdjęcia tutaj

Krok 4: Teraz otwórz widok relacji w tej samej tabeli podrzędnej od dołu w pobliżu widoku wydruku, jak pokazano poniżej.

wprowadź opis zdjęcia tutaj Krok 5: Wybierz kolumnę U, tak jak klucz obcy, jak Wybierz kolumnę Parent z rozwijanej listy. dbName.TableName.ColumnName

Wybierz odpowiednie wartości dla ON DELETE i ON UPDATE wprowadź opis zdjęcia tutaj

Vinod
źródło
2

Najpierw ustaw silnik pamięci jako InnoDB

Najpierw ustaw silnik pamięci jako InnoDB

następnie włącz opcję widoku relacji w menu struktury

następnie włącz opcję widoku relacji

Sahil Ralkar
źródło
Twój pierwszy krok jest poprawny, ale co dalej, napisz cały proces krok po kroku.
kunal shaktawat
2

To jest stary wątek, ale odpowiedz, ponieważ jeśli jest użyteczny dla każdego.

Krok 1 . Twój silnik pamięci Db ustawiony na InnoDB

Krok 2 . Utwórz tabelę podstawową

tutaj customerjest tabela podstawowa i customer_idklucz podstawowy

wprowadź opis zdjęcia tutaj

Etap 3 . utwórz tabelę kluczy obcych i podaj indeks

tutaj mamy customer_addressespowiązaną tabelę i przechowujemy adresy klientów, więc tutaj customer_idrelacja z customertabelą

możemy wybrać indeks bezpośrednio podczas tworzenia tabeli, jak poniżej

wprowadź opis zdjęcia tutaj

Jeśli zapomniałeś podać indeks podczas tworzenia tabeli , możesz podać indeks z zakładki struktury tabeli jak poniżej.

wprowadź opis zdjęcia tutaj

Krok 4 . Po podaniu indeksu do pola, przejdź do zakładki struktury i kliknij Widok relacji, jak pokazano na poniższym obrazku

wprowadź opis zdjęcia tutaj

Krok 5 . Teraz wybierz ON ON DELETE i UPDATE, co chcesz zrobić, wybierz kolumnę z bieżącej tabeli, wybierz dB (SAME DB), wybierz tabelę relacji i klucza podstawowego z tej tabeli, jak pokazano na rys poniżej i Save it

wprowadź opis zdjęcia tutaj

Teraz sprawdź, czy relacja została podana pomyślnie, przejdź do listy danych tabeli obcej i kliknij wartość klucza obcego, nastąpi przekierowanie do rekordu tabeli podstawowej, a następnie relacja utworzona pomyślnie.

Devsi Odedra
źródło
0

Nowsze wersje phpMyAdmin nie mają już opcji „ Widok relacji ”, w takim przypadku musisz wykonać instrukcję, aby osiągnąć to samo. Na przykład

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

W tym przykładzie, jeśli wiersz z firm zostanie usunięty, wszyscy pracownicy z tym identyfikatorem firmy również zostaną usunięci.

Vincent
źródło