A janela de erro “MySQL error number 1005″ fez eu perder a paciência um dia desses à noite enquanto tentava criar os relacionamentos em um banco de dados MySQL. Hoje, com mais calma, saí à procura da solução para o meu problema.
O problema era que eu estava criando um relacionamento com o mesmo nome dado a outro relacionamento já existente, o que não pode ocorrer. Então, entendi o motivo para o próprio MySQL Query Browser sugerir nomes para os relacionamentos utilizando os nomes das tabelas que ele associa.
Aos que não entenderam do que estou falando ou não utilizam relacionamentos no MySQL, sugiro que aprendam e passem a usar. Relacionamento basicamente é fazer referência em uma tabela a uma entrada de outra tabela. Isso é feito criando uma coluna (ou um conjunto de colunas) que armazenará valores que fazem referência ao índice (ou conjunto de índices) da outra tabela com o objetivo de manter a integridade dos dados no banco de dados. A essa(s) coluna(s) se dá o nome de Foreign Key (ou chave estrangeira).
Abaixo, vou dar um passo-a-passo de como criar relacionamentos entre tabelas num banco de dados MySQL utilizando o MySQL Query Browser.
Já tendo conectado o MySQL Query Browser ao seu banco, clique com o botão direito do mouse na tabela que você fará o relacionamento e depois em “Edit Table” (Passo 1).
Abrirá uma janela com diversas informações sobre a sua tabela, na parte inferior clique em “Foreign Keys” (Passo 2) e depois no sinal de adição (Passo 3). Então, digite o nome do relacionamento (lembre que apenas esse relacionamento poderá ter esse nome no banco de dados todo) e dê “OK” (Passo 4).
Preencha “Ref. Table” com o nome da tabela de origem do índice (Passo 5). Na tabela onde tem “Column” e “Reference Column” dê um duplo-clique em cada célula de uma mesma linha e escreva o nome da coluna na tabela atual onde ficará armazenado o índice e o nome da coluna onde esse índice faz referência na outra tabela (Passo 6). Calma! Falta pouco, a melhor parte…
Falta preencher os campos “On delete” e “On update” (Passo 7). Os valores desses campos quem vai ter que saber é você, baseado nas regras de negócio e na implementação do sistema. Esses campos servem para indicar ao banco de dados qual atitude tomar caso a entrada referenciada seja deletada ou atualizada, o que ocasionaria a quebra de integridade das informações do banco de dados. Para cada um desses campos o MySQL pode tomar 4 atitudes: cascade, restrict, no action ou set null.
Como o nome já diz, o CASCADE toma atitudes em cascata. Ou seja, se o item referenciado foi apagado, ele apaga também o item que fazia a referencia. Muito útil para casos em que a existência de um está essencialmente ligada à existência do outro.
Já o RESTRICT pode ser visto como o oposto do cascade, enquanto houver referencias à entrada que você deseja apagar, ela não poderá ser apagada. Você tem que acabar com todos os relacionamentos à ela para poder apagar o item referenciado.
Se você não usa relacionamentos, na hora em que apaga uma entrada, nada acontece a nenhuma outra que poderia ter referencia àquela, sem alterar nada no restante do banco de dados. É exatamente isso que o NO ACTION faz. Se um item referenciado é apagado ou atualizado, nada acontece além disso.
Em determinados casos não é interessante nem apagar os items que fazem referencia, nem impedir a exclusão e nem deixar que o banco de dados perca a integridade. Essa hora você pode usar o SET NULL, com ele quando o relacionamento for perdido, o valor de referencia é atualizado para null, fazendo com que você possa identificar tais casos e tratá-los.
Gostei muito quando aprendi a usar relacionamentos no MySQL, então tentei passar a diante. Abraços!
(Editado em 08/01/2008 – Acrescentado imagens)
[...] o grande número de acessos ao artigo de criação de relacionamentos no MySQL, resolvi dar uma melhorada nele acrescentando imagens das telas dos passos indicadando a posição [...]
8/01/08 às 0:31parabens pelo artigo, me despertou para o relacionamento entre tabelas.
4/05/08 às 20:05Eu ja tinha usado com dBase, e nao entendia como fazer em MySQL.
Valeu abrc
Gostei muito da sua explicação.
Só que tenho uma dúvida.
A dúvida é a seguinte:
Se eu tenho duas tabelas, uma cadastro e a outra endereco.
Na tabela endereço, vamos supor que tenho os seguintes campos:
Tabela cadastro.
id_cad ( é minha chave primaria )
nome
sobrenome
idade
Tabela endereco
id_end ( é minha chave primária )
endereco
numero
compl
bairro
A dúvida é: Se eu quero fazer um relacionamento entre essas duas tabelas, em qual delas eu terei que criar a chave estrangeira?
Você poderia me dizer como ficaria a relação entre essas duas tabelas?
Olha, já procurei muito na internet referente a relacionamento entre tabelas e várias outras coisas.
Parece que as pessoas gostam de esconder o jogo e não faz um passo-a-passo como você fez para que podemos entender.
Grato,
21/05/08 às 1:06caro amigo gostyei muito de sua esplanação
estou fazendo tudo confortmr voce descreveu mas continuop a ter o error
MySQL Error Number 1005
Can’t create table ‘.\dbbanco\#sql-6d4_8.frm’(errno: 150)
caso possa me ajudar agradeeço muito
[]Arthur G Cabral
1/06/08 às 22:45fale amigo
primeiramente, mto bom o artigo, a mto tempo ja estava curioso pra saber para que servia esses campos on update e on delete.
mas não foi isso que resolveu meu problema com o erro que o amigo falou acima…
simplesmente, agora ñ sei pq, desmarquei a opção unsigned na coluna que queria associar pelo mysql administrator e funcionou blz!
abrço!
26/11/08 às 9:21Muito bom, mas não tem como explicar como se faz na UNHA, sem necessidade de programas?
15/04/09 às 20:43Muito boa a sua explicação, mas infelizmente não tenho essas aberturas no phpMyAdmin, pois é o único que conheço que roda em máquinas apple, faz um tempinho que fiz modelagem de dados e os meus manuais estão no Brasil, me lembro que eu criava esses relacionamentos via sql, vc sabe dizer qual é a sintaxe? Obrigado. Braga Junior – Maputo – Moçambique.
17/04/09 às 5:12[...] escrevi sobre a criação de relacionamentos no MySQL anteriormente, então não serei repetitivo em falar sobre as mesmas coisas, mas aconselho a [...]
17/04/09 às 12:50Gostaria de lhe agradecer, por este exelente trabalho.
Foi o melhor tuturial que já li sobre relacionamento de tabelas, simplesmente expetacular!
Parabens e novamente obrigado.
Um Abraço: Bruno
22/04/09 às 4:07Esqueceu de dizer que relacionamentos (FK) em mysql só são possíveis em tabelas do tipo InnoDB mas está muito bom o artigo embora quase enterrado pelo tempo mas atual!
24/06/09 às 0:57Meu…vlw! salvou meu dia!
1/07/09 às 14:33grande abraço.
Bom dia
Cara, valeu, eu comecei a mexer com o MySql, fiz isso, e procurei algo pra confirmar, ai seu post esclareceu
agora, esclarecendo a dúvida do aquino, vc tem q ver como as tabelas estão relacionadas, por exemplo, se tivesse duas tabelas, uma chamada livro, e outra chamada editora, a relação delas seria de um(editora) para muitos(livro), já que é possivel ter vários livros em uma editora, mas não eh possivel ter várias editoras em apenas um livro (pelo menos nunca vi hehe), nesse caso, a chave estrangeira (foreign key, ou FK), estaria do lado do muitos, nesse caso, do livro
no seu caso, de endereço e cadastro, eu diria q a tabela cadastro é o lado do “muitos” e o endereço do “um”, já q eh possivel ter vários cadastros em um unico endereço, mas n eh possivel ter vários endereços em um cadastro
Espero q n tenha ficado confuso xD
agradeço novamente a vc rodrigo, valeu
abraço a todos
21/07/09 às 11:13