sql >> Database teknologi >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Kunne ikke tilføje den fremmede nøgle-begrænsning. Manglende indeks for begrænsning

Prøv først at analysere og forstå dit skema. Jeg kan ikke se en grund til hvorfor teamname bør være en del af den primære nøgle. ID kolonnen er allerede unik på grund af AUTO_INCREMENT mulighed. Så du kan bare gøre den til primær nøgle.

Analyser nu begrænsningerne på teamname . Hvis to hold ikke kan have det samme navn, skal du definere en UNIQUE KEY begrænsning på teamname . Hvis hvert hold skal have et navn, skal du definere en NOT NULL begrænsning på teamname . Med disse begrænsninger er teams kan oprettes som:

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

Nu kan du bruge teamname kolonne for at identificere en række i teams tabel, og kan bruge den som fremmednøgle i andre tabeller. Din kode til players tabellen skulle nu fungere (se demo ).

Bemærk, at en fremmednøgle normalt refererer til en primærnøgle i en anden tabel. players tabel ville blive defineret som:

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

Når du har brug for at kende holdnavnet på en spiller, skal du bruge et JOIN:

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

Bemærk:I de sidste par dage har jeg set spørgsmål med det samme mønster igen og igen. Mønstret er:En fremmednøgle, som refererer til en del af den primære nøgle i en anden tabel. Nogle eksempler:

Kommentarer og svar foreslået for at definere et simpelt indeks på den refererede tabel for at understøtte FK-begrænsningskontrollen. Gør det ikke! Overvej om du prøver at løse dit problem ved blot at definere et indeks på teamnameteams tabel med:

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

MySQL vil acceptere det (se demo ). Men dit skema tillader to hold med samme navn. Forudsat at du har to hold med navnet "aber". Og du har en spiller, der har "aber" som holdnavn (FK). Hvilket af de to hold refereres til? Det kan du ikke sige! Så du må hellere holde dig til simple regler. Og reglen for fremmednøgler er:Henvis kun til fulde UNIQUE eller PRIMÆRE NØGLER. Eller endnu enklere:Henvis kun til fulde PRIMÆRE NØGLER. En fremmednøgleværdi skal identificere en specifik række i den refererede tabel.




  1. Hvad er forskellen mellem pls_integer og binary_integer?

  2. hvordan man finder nøjagtigt data mellem det valgte diagonale område i mysql-forespørgsel

  3. Intervaller angivet i henhold til kolonneværdier i PostgreSQL

  4. Hvordan kan jeg indtaste data med ikke-engelsk (Bangla) sprog i denne databasetabel?