Dica: corrigindo o error 150 (#10005) no MySQL
Neste último bimestre em minhas aulas de banco de dados redescobri a integridade referencial em banco de dados, e suas ações em caso de alteração e exclusão. Redescobrir? Sim… Desde que comecei a mexer com PHP/MySQL eu nunca tinha feito isso, porque as tabelas MyISAM (antigas) não dão suporte a esta funcionalidade. Para quem não conhece, pretendo fazer um vÃdeo tutorial sobre isso em breve, pois é um assunto bastante interessante e economiza bastante tempo na hora de programar. Mas só para dar uma idéia, ele serve para garantir que a integridade de uma chave estrangeira e as ações de quando o registro pai for apagado.
Por exemplo, se tenho uma tabela posts com campos id, titulo, conteudo e uma tabela comentários com os campos id, autor, post_id, o único valor válido para post_id é um valor de id válido em posts. Ou seja, garante-se a integridade no próprio banco de dados. Uma outra funcionalidade é qual ação deverá ser tomada se, por exemplo, um post for apagado, que poderia ser apagar todos os comentários relacionados, evitando comentários sem posts. Isso tudo no banco, sem precisar programar nada!
Este post, é para quem já fez/faz o uso deste recurso e que já se deparou com o erro 150 (#10005).
A dica muito valiosa veio do forum do MySQL, o qual diz que os dois campos devem ser idênticos em seus tipos. Ou seja (aqui estava meu erro) até mesmo se ele é unsigned deve ser igual. As outras condições são:
- Ambas as tabelas do tipo InnoDB;
- Na tabela que faz a referência, deve haver um indÃce que corresponde a chave estrangeira;
- Na tabela referenciada, deve haver um indÃce que corresponde a chave primária;
- Não são suportados para este tipo de relacionamento, campos text e blob;
- Os campos devem ter o mesmo tipo (em todas as caracterÃsticas);
Bom é isso, espero que isso ajude alguém…
Abraços pessoal e até a próxima…
