Foreign Key’s no MySql

Hoje passei por uma situação interessante. Estou fazendo a remodelagem de um banco de dados MySql de um sistema que estou trabalhando atualmente. Como o banco é um pouco grande (cerca de 100 tabelas) e está muito mal organizado e sem referenciação nenhuma, resolvi começar pela organização das foreign keys para melhor visualizar o meu modelo relacional.

Porém caí na situação em que eu rodava um comando de criação de foreign key e ela simplesmente não aparecia na minha tabela referente do bd. Pesquiso dali, pesquiso daqui, descobri uma coisa muito interessante:

O ‘problema’ estava acontecendo por causa dos tipos das minhas tabelas…. Isso mesmo, as tabelas do MySql podem ser de vários tipos. Aqui no meu MySql 5.0.51a tenho os seguintes tipos: Memory, MyISAM, Blackhole, MRG_MYISAM, CSV, ARCHIVE e InnoDB.

Por padrão, tabelas criadas no MySql e sem definição do tipo, são criadas sob o tipo MyISAM. Este tipo de tabela não permite a utilização de transações e nem de foreign keys.

Este era o meu problema, as minhas tabelas eram do tipo MyISAM. Então eu tive que convertê-las para o tipo INNODB que me permite gerar foreign keys. Para alterar fiz o seguinte sql:

alter table [tabela] type = INNODB;

O tipo InnoDB prove ao MySql um mecanismo de armazenamento seguro com transações com commit, rollback e recuperação em caso de falhas. O bloqueio é realizado a nível de registro (row locking) ao contrário do MyISAM que faz o bloqueio por tabela (table locking). Isto faz aumentar a performance e concorrência de multi usuários [ele foi desenvolvido para obter o máximo de performance ao processar grande volume de dados].

O InnoDB armazena as tabelas e índices em um espaço de tabela, o qual pode consistir de vários arquivos, diferentemente do MyISAM onde cada tabela é armazenada em um arquivo separado.

Além disso tudo, ainda é o primeiro tipo que suporta restrições Foreign Key…. \o/

2 comentários sobre “Foreign Key’s no MySql

Deixar mensagem para Thiago Cancelar resposta