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