Rodrigo Aguas

Criando relacionamentos no MySQL

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).

Passo-a-passo para criar relacionamentos - Tela 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).

Passo-a-passo como criar relacionamentos - Tela 2Passo-a-passo para criar relacionamentos - Tela 3

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…

Passo-a-passo para criar relacionamentos - Tela 4

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)

12 Comentários para “Criando relacionamentos no MySQL”

  1. rodrigoaguas.com - Artigo » Atualização do passo-a-passo de como criar relacionamentos no MySQL diz:

    [...] 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 [...]

  2. Agnaldo diz:

    parabens pelo artigo, me despertou para o relacionamento entre tabelas.
    Eu ja tinha usado com dBase, e nao entendia como fazer em MySQL.
    Valeu abrc

  3. Aquino diz:

    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,

  4. Arthur G Cabral diz:

    caro 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

  5. Felipe diz:

    fale 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!

  6. Natanael diz:

    Muito bom, mas não tem como explicar como se faz na UNHA, sem necessidade de programas?

  7. Braga Junior diz:

    Muito 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.

  8. rodrigoaguas.com - Artigo » Criação de Tabelas e Relacionamentos com SQL diz:

    [...] 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 [...]

  9. Bruno diz:

    Gostaria 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

  10. Parpiteiro diz:

    Esqueceu 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!

  11. Giovani diz:

    Meu…vlw! salvou meu dia!
    grande abraço.

  12. Guilherme diz:

    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

Deixe seu comentário