Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Falha ao adicionar a restrição de chave estrangeira. Índice ausente para restrição


Primeiro tente analisar e entender seu esquema. Não vejo um motivo para teamname deve fazer parte da chave primária. O ID coluna já é única devido ao AUTO_INCREMENT opção. Então você pode apenas torná-lo chave primária.

Agora analise as restrições em teamname . Se duas equipes não podem ter o mesmo nome, você deve definir uma UNIQUE KEY restrição em teamname . Se cada equipe deve ter um nome, você deve definir um NOT NULL restrição em teamname . Com essas restrições, as teams pode ser criado como:
CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (teamname )
);

Agora você pode usar o teamname coluna para identificar uma linha nas teams tabela, e pode usá-lo como chave estrangeira em outras tabelas. Seu código para os players agora deve funcionar (veja demonstração ).

Observe que geralmente uma chave estrangeira faz referência a uma chave primária de outra tabela. Os players tabela seria definida como:
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)
);

Quando você precisa saber o nome do time de um jogador, você usaria um JOIN:
SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id

Nota:Nos últimos dias tenho visto perguntas com o mesmo padrão repetidas vezes. O padrão é:Uma chave estrangeira que referencia uma parte da chave primária em outra tabela. Alguns exemplos:

Comentários e respostas sugeridos para definir um índice simples na tabela referenciada para dar suporte à verificação de restrição FK. Não faça isso! Considere se você tentar corrigir seu problema apenas definindo um índice em teamname nas teams mesa com:
CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  INDEX (teamname )
);

O MySQL aceitará isso (veja demo ). Mas seu esquema permite duas equipes com o mesmo nome. Supondo que você tenha duas equipes com o nome "macacos". E você tem um jogador que tem "macacos" como nome do time (FK). Qual das duas equipes é referenciada? Você não pode dizer! Então é melhor você se ater a regras simples. E a regra para chaves estrangeiras é:Referencie somente CHAVES ÚNICAS ou PRIMÁRIAS completas. Ou ainda mais simples:Referencie apenas as CHAVES PRIMÁRIAS completas. Um valor de chave estrangeira deve identificar uma linha específica na tabela referenciada.