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:
- qual é o problema com minhas tabelas no mysql?
- Código de erro :1822. Falha ao adicionar a restrição de chave estrangeira
- #1005 (errno :150 "A restrição de chave estrangeira está formada incorretamente")
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.