FIREBIRD - RELACIONAMENTOS
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
Complicado mesmo heim...rs
Faz assim, deixa as estruturas das tabelas da seguinte forma:
[th]
* Campo autonumério
** Este campo se relacionará com a tabela AUTOR
[th]
* 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:
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
Faz assim, deixa as estruturas das tabelas da seguinte forma:
LIVROS | [/th]
CODIGO * |
CODBARRA |
COADADI |
TITULO |
COD_AUTOR ** |
* Campo autonumério
** Este campo se relacionará com a tabela AUTOR
AUTOR | [/th]
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:
ON DELTE/UPDATE SET NULL
Passa o valor para NULL
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
ON DELETE/UPDATE NO ACTION
Não faz nada, ao deletar o banco pode retornar um erro, daà é só tratá-lo
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