Resolvendo o Problema de Múltiplas Chaves Estrangeiras
no MySQL: Um Guia Passo a Passo
Ao trabalhar com bancos de dados, especificamente no MySQL, você pode encontrar cenários onde precisa implementar múltiplas chaves estrangeiras que referenciam a mesma tabela pai. Isso pode ser particularmente desafiador, como visto no problema enfrentado por muitos usuários, como tentar associar diferentes fornecedores dentro de uma tabela de detalhes de envio. Neste post, exploraremos uma pergunta comum sobre múltiplas chaves estrangeiras, forneceremos uma solução estruturada abrangendo as melhores práticas e o guia para o processo de resolução de problemas.
O Problema
Imagine que você possui uma tabela SHIPMENT_DETAILS
que é responsável por rastrear tanto os fornecedores de envio (como FedEx ou UPS) quanto os fornecedores de manuseio de produtos (pense na Dunder Mifflin). Nessa situação, várias colunas dentro dos detalhes de envio precisam referenciar a mesma tabela pai, VENDOR
. No entanto, problemas podem surgir quando você tenta criar restrições de chave estrangeira para essas colunas, como a incapacidade de definir múltiplas chaves estrangeiras.
Os usuários frequentemente experienciam erros como o seguinte:
Não é possível criar a tabela './<DB_NAME>/SHIPPING_GRID.frm' (errno: 150)
Esse erro normalmente sinaliza um problema com a definição da chave estrangeira ou com os tipos de dados envolvidos.
Visão Geral da Solução
Para resolver o problema de definir múltiplas chaves estrangeiras no MySQL, siga estas etapas:
-
Defina Estrutura da Tabela Corretamente: Assegure-se de que sua tabela
VENDOR
tenha uma chave primária única que seja compatível com as colunas de chave estrangeira na sua tabelaSHIPPING_DETAILS
. -
Corrija o Tipo da Tabela: Certifique-se de que ambas as tabelas (
VENDOR
eSHIPPING_GRID
) sejam do tipoInnoDB
. Isso é crucial, pois restrições de chaves estrangeiras não são suportadas em outros mecanismos de armazenamento como MyISAM. -
Assegure a Compatibilidade dos Tipos de Dados: Verifique se os tipos de dados das chaves estrangeiras correspondem ao tipo de dados da chave primária que referenciam. Por exemplo, se
VENDOR.no
é definido comoINT(6)
, todas as referências de chaves estrangeiras também devem ser do mesmo tipo. -
Evite Definições Duplicadas de Chave Primária: Assegure-se de que sua instrução SQL não inclua inadvertidamente múltiplas definições da chave primária. Isso pode levar a erros durante a criação da tabela.
Exemplo de Código
Aqui está um exemplo corrigido de como sua tabela SHIPPING_GRID
pode ser definida corretamente após considerar os pontos acima:
CREATE TABLE SHIPPING_GRID(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID exclusivo para cada linha',
shipping_vendor_no INT(6) NOT NULL COMMENT 'Chave estrangeira para VENDOR.no para o fornecedor de envio (vendors_type deve ser 3)',
start_vendor_no INT(6) NOT NULL COMMENT 'Chave estrangeira para VENDOR.no para o fornecedor de onde está sendo enviado',
end_vendor_no INT(6) NOT NULL COMMENT 'Chave estrangeira para VENDOR.no para o fornecedor para o qual está sendo enviado',
shipment_duration INT(1) DEFAULT 1 COMMENT 'Duração em dias inteiros que a remessa levará',
price FLOAT(5,5) NOT NULL COMMENT 'Preço em dólares americanos por remessa lbs (até 5 casas decimais)',
is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 se for taxa fixa independentemente do peso, 0 se o preço for por lbs',
INDEX (shipping_vendor_no),
INDEX (start_vendor_no),
INDEX (end_vendor_no),
FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),
FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),
FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)
) ENGINE=InnoDB;
Principais Conclusões
- Tipos de Dados Importam: Sempre assegure-se de que as colunas de chaves estrangeiras correspondam ao tipo de dados da chave primária referenciada.
- Use InnoDB: Se você está configurando chaves estrangeiras entre tabelas, usar o mecanismo
InnoDB
é essencial. - Evite Duplicatas: Se você encontrar erros em seu SQL, verifique novamente se há definições duplicadas ou problemas de sintaxe.
Seguindo essas diretrizes, você pode efetivamente criar sua tabela com múltiplas chaves estrangeiras e evitar armadilhas comuns associadas a restrições de chaves estrangeiras. Boa sorte com suas iniciativas em MySQL e boas codificações!