Dúvida de implementação SQL - Foreign Keys e Constraints

Pessoal, na criação ou alteração de tabelas utilizando o Mysql vejo que é possível adicionar uma chave estrangeira das seguintes maneiras no comando ALTER ou no CREATE (No exemplo, utilizo com o ALTER):
1º Maneira:

    mysql> alter table comivenda add constraint fk_comivenda_comprodu
foreign key(n_numeprodu)
references comprodu (n_numeprodu);

2º Maneira:

       mysql> alter table comivenda add foreign key(n_numeprodu)
       references comprodu (n_numeprodu);

Percebo que a diferença fica com o uso da palavra chave constraint e o seu respectivo nome.

O que ela significa e quais as diferenças entre essas duas implementações (seja em qualquer comando de manipulação como o alter e o create)?

Obs: Estou usando o InnoDB como motor do Mysql.

A diferença é que pela segunda maneira o banco vai atribuir à foreign key um nome interno, usando as convenções dele.

Experimente montar esse relacionamento usando as duas formas e tente inserir um registro que estoure a FK (ou seja, passando um n_numeprodu que não exista na tabela comprodu). Você vai perceber a diferença pelas mensagens de erro que o banco te retornar.

No seu primeiro exemplo como você informou um nome para a FK -> fk_comivenda_comprodu, quando ocorrer qualquer erro em relação a essa restrição o MySQL irá lhe mostrar o erro indicando o nome que você criou.
Já no segundo exemplo como você não informou nome o MySQL criará um nome automaticamente para esta constraint.
Tá, mas porque devo criar um nome para uma constraint se o MySQL faz isso sozinho ?
Imagine você dentro de uma aplicação procurando por um erro no banco informando o nome da restrição que você criou, por exemplo:
Message: SQLSTATE[23000]: Integrity constraint violation: fk_comivenda_comprodu

Fica fácil entender entender não é ?

Agora imagine se você deixar ele criar o nome da restrição automaticamente:

Message: SQLSTATE[23000]: Integrity constraint violation: SYS_C00332256

Imagine localizar isso dentro de um BD independente do n° de tabelas que existam.

Esse é justamente o ponto ! ótima explicação.

1 curtida

Muito bem explicado. Obrigado!

1 curtida