Konfiguruję bazę danych przy użyciu phpMyAdmin. Mam dwie tabele ( foo
i 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 id
pola są INT(11)
.
Kiedy wybrać foo_bar
tabelę, kliknij „Widok relacyjny” link i spróbuj ustawić kolumny FK być database.foo.id
i database.bar.id
to 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.
źródło
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:
Wykonując eksport do tabeli CHILD, powinieneś zobaczyć ograniczenie klucza obcego dla kolumny PID.
źródło
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.
źródło
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).
Możesz przypisać klucz do kucia z pola listy obok klucza głównego (patrz obrazek poniżej). i zapisz
odpowiednie zapytanie SQL wygenerowane i wykonane automatycznie.
źródło
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 .
Przejdź do karty SQL (używam phpMyAdmin, powinien być podobny w innych) i wykonaj następujące polecenie:
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ń ...
źródło
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
źródło
InnoDB umożliwia dodanie nowego ograniczenia klucza obcego do tabeli za pomocą ALTER TABLE:
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!
źródło
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)
źródło
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.
Krok 2: Teraz podczas tworzenia tabeli zobaczysz typ tabeli: InnoDB
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.
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.
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
źródło
Najpierw ustaw silnik pamięci jako InnoDB
następnie włącz opcję widoku relacji w menu struktury
źródło
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
customer
jest tabela podstawowa icustomer_id
klucz podstawowyEtap 3 . utwórz tabelę kluczy obcych i podaj indeks
tutaj mamy
customer_addresses
powiązaną tabelę i przechowujemy adresy klientów, więc tutajcustomer_id
relacja zcustomer
tabeląmożemy wybrać indeks bezpośrednio podczas tworzenia tabeli, jak poniżej
Jeśli zapomniałeś podać indeks podczas tworzenia tabeli , możesz podać indeks z zakładki struktury tabeli jak poniżej.
Krok 4 . Po podaniu indeksu do pola, przejdź do zakładki struktury i kliknij Widok relacji, jak pokazano na poniższym obrazku
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
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.
źródło
Z oficjalnej dokumentacji MySQL na https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
źródło
Nowsze wersje phpMyAdmin nie mają już opcji „ Widok relacji ”, w takim przypadku musisz wykonać instrukcję, aby osiągnąć to samo. Na przykład
W tym przykładzie, jeśli wiersz z firm zostanie usunięty, wszyscy pracownicy z tym identyfikatorem firmy również zostaną usunięci.
źródło