Konfigurowanie kluczy obcych w phpMyAdmin?

Konfiguruję bazę danych za pomocą phpMyAdmin. Mam dwie tabele (foo i bar), indeksowane na ich głównych kluczach . Próbuję utworzyć relacyjną tabelę (foo_bar) pomiędzy nimi, używając ich kluczy głównych jako kluczy obcych.

Stworzyłem te tabele jako MyISAM, ale od tego czasu zmieniłem wszystkie trzy na InnoDB, ponieważ czytałem, że MyISAM nie obsługuje kluczy obcych. Wszystkie pola id to INT(11).

Kiedy wybieram tabelę foo_bar, klikam link "widok relacji" i staram się Ustaw kolumny FK na database.foo.id i database.bar.id, mówi " nie zdefiniowano indeksu!" obok każdej kolumny.

Co mi umyka?

Wyjaśnienie / Aktualizacja

Ze względu na prostotę, chcę nadal używać phpMyAdmin. Obecnie używam XAMPP, który jest wystarczająco łatwy, aby pozwolić mi skupić się na PHP / CSS / Javascript, i pochodzi z phpMyAdmin.

Ponadto, chociaż nie byłem jeszcze w stanie skonfigurować jawnych kluczy obcych, mam relacyjną tabelę i mogę wykonywać połączenia tak:

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 sprawia, że czuję się niekomfortowo nie mieć FKS wyraźnie zdefiniowane w bazie danych.

Author: Nathan Long, 2009-01-20

9 answers

Jeśli chcesz użyć phpMyAdmin do skonfigurowania relacji, musisz zrobić 2 rzeczy. Przede wszystkim należy zdefiniować indeks w kolumnie klucza obcego w tabeli referującej (czyli foo_bar.foo_id, w Twoim przypadku). Następnie przejdź do widoku relacji (w tabeli referującej) i wybierz kolumnę, o której mowa (tak w Twoim przypadku foo.id) oraz akcje on update i on delete.

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ótki, jeśli poprawnie ustawisz opcje odniesienia.

EDIT: upewnij się, że obie tabele mają wybrany silnik InnoDB.

 316
Author: rael_kid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 18:57:49

PhpMyAdmin pozwala definiować klucze obce za pomocą ich widoku "Relacje". Ale ponieważ MySQL obsługuje tylko obce ograniczenia tabel "INNO DB", pierwszym krokiem jest upewnienie się, że tabele, których używasz, są tego typu.

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

  1. dla obu tabel przejdź do zakładki operacje i zmień ich typ na"INNO DB"
  2. Upewnij się, że ID jest klucz główny (lub przynajmniej indeksowana kolumna) tabeli nadrzędnej.
  3. w tabeli podrzędnej zdefiniuj indeks dla kolumny PID.
  4. podczas przeglądania zakładki struktura tabeli podrzędnej kliknij łącze " widok relacji "tuż nad sekcją" Dodaj pola".
  5. otrzymasz tabelę, w której każdy wiersz odpowiada indeksowanej kolumnie w tabeli klienta. Pierwsze rozwijane menu w każdym wierszu pozwala wybrać, do której tabeli - > kolumny odnoszą się indeksowane kolumny. W wierszu dla PID wybierz PARENT - > ID z rozwijanego menu i kliknij GO.

Wykonując eksport na tabeli podrzędnej, powinieneś zobaczyć ograniczenie klucza obcego dla kolumny PID.

 205
Author: awais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-26 12:10:15

To jest podsumowanie artykułu w Wikipedii. Określa różne typy relacji, które można określić w PHPmyadmin. Umieszczam go tutaj, ponieważ jest to istotne dla komentarza @ Nathan na ustawianie opcji kluczy obcych dla "on update/delete", ale jest zbyt duży na komentarz-mam nadzieję, że pomoże.

CASCADE

Za każdym razem, gdy wiersze w tabeli głównej (odniesienia) są usuwane (resp. aktualizacja), odpowiednie wiersze tabeli Potomków (referencji) z pasującym obcym kolumna kluczowa zostanie usunięta (lubsp. aktualizacja). Jest to tzw. kasowanie kaskadowe (resp. aktualizacja [2]).

RESTRICT

Wartość nie może zostać zaktualizowana lub usunięta, gdy wiersz istnieje w tabeli kluczy obcych, który odwołuje się do wartości w tabeli odniesienia. Podobnie wiersz nie może zostać usunięty, o ile istnieje odniesienie do niego z tabeli kluczy obcych.

NO ACTION

NO ACTION I RESTRICT są bardzo podobne. Główna różnica między brakiem działania a ograniczenie polega na tym, że bez żadnej akcji sprawdzanie referencjalnej integralności odbywa się po próbie zmiany tabeli. Funkcja RESTRICT wykonuje sprawdzenie przed próbą wykonania instrukcji UPDATE lub DELETE. Obie akcje referencyjne zachowują się tak samo, jeśli sprawdzenie integralności odniesienia nie powiedzie się: polecenie UPDATE lub DELETE spowoduje błąd.

SET NULL

Wartości klucza obcego w wierszu odniesienia są ustawiane na NULL, gdy wiersz odniesienia jest aktualizowany lub usuwany. Jest to możliwe tylko jeśli odpowiednie kolumny w tabeli odniesienia są nullable. Ze względu na semantykę NULL, wiersz odniesienia z Null w kolumnach klucza obcego nie wymaga wiersza odniesienia.

USTAW DOMYŚLNE

Podobnie jak SET NULL, wartości klucza obcego w wierszu odniesienia są ustawiane na domyślną kolumnę, gdy wiersz odniesienia jest aktualizowany lub usuwany.

 74
Author: Brett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-10 01:45:30

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

Tutaj wpisz opis obrazka

Możesz przypisać klucz kucia z listy obok klucza głównego.(Patrz zdjęcie poniżej). i zapisz

Tutaj wpisz opis obrazka

Odpowiednie zapytanie SQL automatycznie generowane i wykonywane.

 50
Author: Nishad Up,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 09:28:28

Dla nowych w bazie danych .... i trzeba zmienić istniejącą tabelę. Wiele rzeczy wydaje się być dość proste, ale zawsze jest coś ... między A a B.

Zanim cokolwiek innego, spójrz na to .

  1. upewnij się, że masz P_ID (identyfikator rodzica w tabeli parent i child).
  2. oczywiście, że będzie już wypełniony w rodzicu. Niekoniecznie w dziecku w sposób prawdziwy i ostateczny. Czyli np. P_ID #3 (może wiele razy w dziecku tabela będzie wskazywała na oryginalny P_ID w tabeli nadrzędnej).
  3. Przejdź do zakładki SQL (używam phpMyAdmin, powinno być podobnie w innych) i wykonaj następujące polecenie:

    ALTER TABLE child_table_name
    DODAJ KLUCZ OBCY (P_ID)
    Referencje parent_table_name (P_ID)

  4. Kliknij na tabeli podrzędnej, następnie strukturę, wreszcie na widoku relacyjnym. Dokończ planowanie DB. Przed tym była fajna odpowiedź o kaskadzie, ograniczeniu itp. Oczywiście można to zrobić przez polecenia...

 11
Author: user2060451,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 05:06:05

klucz obcy oznacza, że atrybut nie prime tabeli odwołuje się do atrybutu prime innej *w phpMyAdmin * najpierw ustaw kolumnę, którą chcesz ustawić jako indeks

Następnie kliknij na RELATION VIEW

Tam można znaleźć opcje ustawiania klucza obcego

 9
Author: Shafeeq M kunjumoideen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-25 10:56:07

InnoDB pozwala na 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 klucza obcego. Możesz to zrobić na poziomie modelu aplikacji. Po prostu upewnij się, że kolumny, których chcesz użyć jako kluczy obcych, są indeksowane!

 7
Author: markus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-21 09:07:57

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

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

Błąd tworzenia klucza obcego na [PID kolumna] (sprawdź typy danych)

 4
Author: pouya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 18:08:42

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 uruchom ponownie usługę mysqld. Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka

Krok 3: Utwórz zarówno tabelę rodzica, jak i tabelę potomną. Teraz otwórz tabelę potomną i wybierz kolumnę u like, aby mieć klucz obcy: Wybierz klucz indeksu z Etykieta działania, jak pokazano poniżej.

Tutaj wpisz opis obrazka

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

Tutaj wpisz opis obrazka Krok 5: Wybierz kolumnę u jak mieć klucz obcy, jak wybierz kolumnę rodzica z listy rozwijanej. dbName./ Align = "left" / ColumnName

Wybierz odpowiednie wartości dla on DELETE i ON UPDATE Tutaj wpisz opis obrazka

 2
Author: Vinod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 21:07:59