FIREBIRD - RELACIONAMENTOS

TRTNCG 08/09/2006 23:08:22
#170340
Opa pessoal tenho um banco em FIREBIRD onde tenhos várias tabelas, por exemplo tenho uma tabela chamada livros certo a estrutura da mesma tenho os campos, CODBARRA, COADADI, TTULo AUTOR... e mais outros campos. Quando vou cadastrar os livros tenho o autor em outra tabelas certo, sendo que guardo na tabelas livros no campo autor somente o codigo, entendido. Agora fica muito complicado trabalhar dessa maneira pois até a consulta fica um pouco complexa, minha dúvida é tem como fazer em FIRE toda vez que alterar o nome do autor ele automaticamente atuaslizar em outras tabelas o nome do autor também, pois dessa maneira se for possível fica mais fácil
USUARIO.EXCLUIDOS 09/09/2006 11:00:39
#170379
Resposta escolhida
Complicado mesmo heim...rs
Faz assim, deixa as estruturas das tabelas da seguinte forma:

[th][/th]
LIVROS
CODIGO *
CODBARRA
COADADI
TITULO
COD_AUTOR **


* Campo autonumério
** Este campo se relacionará com a tabela AUTOR

[th][/th]
AUTOR
CODIGO *
NOME


* Tb será autonumérico

Sendo assim, o CODIGO de ambas tabelas, após gravados NUNCA poderão ser alterados, daí qdo for gravar um LIVRO vc pega o CODIGO do AUTOR selecionado, sendo assim, se o usuário alterar o NOME do AUTOR ao realizar a consulta (para LIVROS) virá com o nome alterado, sua consulta para pegar os livros ficaria da seguinte forma:

SQL = "SELECT A.*, B.NOME AUTOR, B.CODIGO COD_AUTOR " & _
"FROM LIVROS A, AUTOR B " & _
"WHERE A.COD_AUTOR = B.CODIGO "


Dessa forma vc não teria problemas...
Mas isso ainda pode ser mais agilizado e ter maior segurança, com vc INFORMANDO ao FireBird q se trata de um relacionamento, para tanto execute o seguinte comando (no seu prog. de adm. do FB):

ALTER TABLE LIVROS
ADD CONSTRAINT FK_LIVROS_AUTOR
FOREIGN KEY (COD_AUTOR)
REFERENCES AUTOR (COD_AUTOR)
ON UPDATE CASCADE
ON DELETE CASCADE;

Explicando:
ALTER TABLE LIVROS
Inicia alteração na tabela livros
ADD CONSTRAINT FK_LIVROS_AUTOR
Adiciona uma CONSTRAINT (chave) com o nome "FK_LIVROS_AUTOR", o nome pode ser alterado
FOREIGN KEY (COD_AUTOR)
Informa q trata-se de uma FOREIGN KEY (chave estrangeira, de relacionamentos entre tabelas) cujo o campo q vc utilizará será o COD_AUTOR
REFERENCES AUTOR (COD_AUTOR)
Informa q a tabela referenciada é AUTOR, e o campo nesta tabela é COD_AUTOR
ON UPDATE CASCADE
Quer dizer que se vc alterar o COD_AUTOR na tabela AUTOR, será AUTOMATICAMENTE o COD_AUTOR na tabela LIVROS para o mesmo valor
ON DELETE CASCADE
CUIDADO, isto quer dizer q ao deletar um AUTOR, o LIVRO será deletado AUTOMATICAMENTE...

ON DELETE e ON UPDATE tem outras opções:
  • SET NULL:
    ON DELTE/UPDATE SET NULL
    Passa o valor para NULL

  • SET DEFAULT:
    ON DELETE/UPDATE SET DEFAULT
    Passa o valor para o valor DEFAULT do campo, este é mto bom e eu costumo usar no ON DELETE, pois no seu caso seria, eu deixo um AUTOR com codigo = 0 e nome = "<não informado>", e o DEFAULT do campo COD_AUTOR na tabela LIVROS deixo como "0" (ADD COD_AUTOR INTEGER DEFAULT '0' NOT NULL), sendo assim se se deleta um AUTOR, os LIVROS daquela autor passam a ter como autor o "<não informado>" e vc não tem mto trabalho, porém sempre q for listar os autores terá de por a condição pra não pegar o com cod 0, tipo:
    SELECT * FROM AUTOR WHERE COD_AUTOR > 0

  • NO ACTION
    ON DELETE/UPDATE NO ACTION
    Não faz nada, ao deletar o banco pode retornar um erro, daí é só tratá-lo

  • CASCADE
    ON DELTE/UPDATE CASCADE
    Já foi dito, muda num muda noutro, deleta um deleta outro..

    é isso, qualquer dúvida poste...flw
  • Tópico encerrado , respostas não são mais permitidas