sql >> Databáze >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Nepodařilo se přidat omezení cizího klíče. Chybějící index pro omezení

Nejprve se pokuste analyzovat a pochopit své schéma. Nevidím důvod, proč teamname by měl být součástí primárního klíče. ID sloupec je již jedinečný díky AUTO_INCREMENT volba. Takže z něj můžete udělat primární klíč.

Nyní analyzujte omezení teamname . Pokud dva týmy nemohou mít stejné jméno, měli byste definovat UNIQUE KEY omezení na teamname . Pokud musí mít každý tým název, měli byste definovat NOT NULL omezení na teamname . S těmito omezeními teams lze vytvořit jako:

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

Nyní můžete použít teamname k identifikaci řádku v teams tabulky a lze jej použít jako cizí klíč v jiných tabulkách. Váš kód pro players tabulka by nyní měla fungovat (viz ukázka ).

Všimněte si, že cizí klíč obvykle odkazuje na primární klíč jiné tabulky. players tabulka by byla definována 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)
);

Když potřebujete znát název týmu hráče, použijte JOIN:

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

Poznámka:V posledních dnech jsem znovu a znovu viděl otázky se stejným vzorem. Vzor je:Cizí klíč, který odkazuje na část primárního klíče v jiné tabulce. Několik příkladů:

Komentáře a odpovědi navrhovaly definovat jednoduchý index v odkazované tabulce na podporu kontroly vazby FK. Nedělejte to! Zvažte, zda se pokusíte problém vyřešit pouhým definováním indexu na teamname v teams tabulka s:

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

MySQL to přijme (viz ukázku ). Ale vaše schéma umožňuje dva týmy se stejným názvem. Za předpokladu, že máte dva týmy s názvem „opice“. A máte hráče, který má jako název týmu "opice" (FK). Na který z těchto dvou týmů se odkazuje? Nemůžeš říct! Raději se tedy držte jednoduchých pravidel. A pro cizí klíče platí:Odkazujte pouze na úplné UNIKÁTNÍ nebo PRIMÁRNÍ KLÍČE. Nebo ještě jednodušší:Odkazujte pouze na plné PRIMÁRNÍ KLÍČE. Hodnota cizího klíče by měla identifikovat konkrétní řádek v odkazované tabulce.




  1. Oracle Update Query pomocí Join

  2. Začínáme s Shareplexem ve Windows na AWS, část 1

  3. Hodnota sloupce identity náhle vyskočí na 1001 na serveru SQL

  4. Zpracování ExecuteScalar(), když nejsou vráceny žádné výsledky