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.