Mysql
 sql >> Baza danych >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Nie udało się dodać ograniczenia klucza obcego. Brakujący indeks dla ograniczenia

Najpierw spróbuj przeanalizować i zrozumieć swój schemat. Nie widzę powodu, dlaczego teamname powinien być częścią klucza podstawowego. ID kolumna jest już unikalna ze względu na AUTO_INCREMENT opcja. Możesz więc po prostu ustawić go jako klucz podstawowy.

Teraz przeanalizuj ograniczenia dotyczące teamname . Jeśli dwie drużyny nie mogą mieć tej samej nazwy, należy zdefiniować UNIQUE KEY ograniczenie na teamname . Jeśli każdy zespół musi mieć nazwę, powinieneś zdefiniować NOT NULL ograniczenie na teamname . Z tymi ograniczeniami teams można utworzyć jako:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (teamname )
);

Teraz możesz użyć teamname kolumna do identyfikacji wiersza w teams tabeli i może używać go jako klucza obcego w innych tabelach. Twój kod dla players tabela powinna teraz działać (patrz demonstracja ).

Zauważ, że zwykle klucz obcy odwołuje się do klucza podstawowego innej tabeli. players tabela będzie zdefiniowana jako:

CREATE TABLE IF NOT EXISTS players (
  ID INT NOT NULL AUTO_INCREMENT,
  player_name VARCHAR(255),
  cm INT NOT NULL,
  team_id INT,
  PRIMARY KEY (ID),
  FOREIGN KEY (team_id) REFERENCES teams(ID)
);

Jeśli chcesz znać nazwę drużyny zawodnika, użyj JOIN:

SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id

Uwaga:W ciągu ostatnich kilku dni wielokrotnie widziałem pytania o tym samym wzorze. Wzorzec to:klucz obcy, który odwołuje się do części klucza podstawowego w innej tabeli. Kilka przykładów:

Komentarze i odpowiedzi sugerowały zdefiniowanie prostego indeksu w tabeli, do której się odwołuje, w celu obsługi sprawdzania ograniczeń FK. Nie rób tego! Zastanów się, czy spróbujesz rozwiązać swój problem, po prostu definiując indeks w teamname w teams tabela z:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  INDEX (teamname )
);

MySQL to zaakceptuje (zobacz demo ). Ale twój schemat dopuszcza dwie drużyny o tej samej nazwie. Zakładając, że masz dwie drużyny o nazwie „małpy”. I masz gracza, który ma „małpy” jako nazwę drużyny (FK). Który z dwóch zespołów jest wymieniony? Nie możesz powiedzieć! Więc lepiej trzymaj się prostych zasad. A reguła dla kluczy obcych jest następująca:Odwołuj się tylko do pełnych KLUCZY UNIKATOWYCH lub PODSTAWOWYCH. Lub jeszcze prościej:odwołuj się tylko do pełnych KLUCZY PODSTAWOWYCH. Wartość klucza obcego powinna identyfikować konkretny wiersz w tabeli odniesienia.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Node.js + MySQL - obsługa transakcji

  2. Jak odwołać się do atrybutu w tabeli do wartości w nowym wierszu w tej samej tabeli?

  3. zły argument nr 1 dla „ipairs” (oczekiwano tabeli, otrzymano wartość logiczną)

  4. MySQL:kolejne pozycje zleceń

  5. Jak przywrócić bazę danych podwójnie zakodowaną przez mysqldump