sql >> Database >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Kan de externe-sleutelbeperking niet toevoegen. Ontbrekende index voor beperking

Probeer eerst uw schema te analyseren en te begrijpen. Ik zie geen reden waarom teamname moet deel uitmaken van de primaire sleutel. De ID kolom is al uniek vanwege de AUTO_INCREMENT keuze. Je kunt er dus gewoon een primaire sleutel van maken.

Analyseer nu de beperkingen op teamname . Als twee teams niet dezelfde naam kunnen hebben, moet u een UNIQUE KEY definiëren beperking op teamname . Als elk team een ​​naam moet hebben, moet u een NOT NULL define definiëren beperking op teamname . Met deze beperkingen zullen de teams kan worden gemaakt als:

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

Nu kunt u de teamname . gebruiken kolom om een ​​rij te identificeren in de teams table, en kan het gebruiken als refererende sleutel in andere tabellen. Uw code voor de players tabel zou nu moeten werken (zie demo ).

Merk op dat een externe sleutel meestal verwijst naar een primaire sleutel van een andere tabel. De players tabel zou worden gedefinieerd als:

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)
);

Als je de teamnaam van een speler wilt weten, gebruik je een JOIN:

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

Opmerking:de afgelopen dagen heb ik steeds weer vragen met hetzelfde patroon gezien. Het patroon is:Een externe sleutel die verwijst naar een deel van de primaire sleutel in een andere tabel. Enkele voorbeelden:

Opmerkingen en antwoorden stelden voor om een ​​eenvoudige index op de tabel waarnaar wordt verwezen te definiëren om de FK-beperkingscontrole te ondersteunen. Doe dat niet! Overweeg of u uw probleem probeert op te lossen door een index te definiëren op teamname op de teams tafel met:

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

MySQL accepteert dat (zie demo ). Maar uw schema staat twee teams met dezelfde naam toe. Ervan uitgaande dat je twee teams hebt met de naam "apen". En je hebt een speler die "apen" als teamnaam (FK) heeft. Naar welke van de twee teams wordt verwezen? Je kunt het niet zeggen! Je kunt je dus maar beter aan simpele regels houden. En de regel voor buitenlandse sleutels is:verwijs alleen naar volledige UNIEKE of PRIMAIRE SLEUTELS. Of nog eenvoudiger:verwijs alleen naar volledige PRIMAIRE SLEUTELS. Een externe sleutelwaarde moet een specifieke rij in de tabel waarnaar wordt verwezen identificeren.




  1. Hoe PowerShell-script op Taakplanner uit te voeren?

  2. Selecteer specifieke rijen en kolommen uit een SQL-database

  3. python en mysql op mac os x

  4. hoe de door komma's gescheiden waarde van de database toe te voegen, te bewerken en te verwijderen.?