Um campo com mais de uma FK

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Freidinger
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 30 Nov 2011 2:10 pm

Olá pessoas, tudo bem?

Eu criei uma tabela de contas a pagar que irá receber informações tanto do pedido de compras quanto de uma eventual nota de entrada(pode ser para outras formas também).

Nesta tabela, criei um campo genérico chamado id_processo e outro tipo_processo, onde criei 2 constraints de fk disparadas para o pedido de compra e para a nota.

A minha idéia seria que quando eu inserisse alguma coisa no contas a pagar, se o campo id_processo não fosse nulo e que o campo tipo_processo recebesse PC ou NE(Pedido de Compra ou Nota de Entrada), buscava informações dos respectivos processos.

Essa idéia só funcionou quando eu removi as constraints de fk.

Com as constraints, me dá um erro falando que o número de nota não foi encontrado(no caso, estou inserindo o pedido 10 e nota está no número 1000).

Eu não gostaria de criar 1 campo para cada tipo, pois, se mais tarde houverem mais tipos, terei que ficar criando campos, por isso, deixei dessa forma mais 'dinâmica'.

Há alguma outra forma de fazer, utilizando as constraints?

Obrigado,
Freidinger
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Freidinger,

Creio não ser possível criar um campo genérico e atribuir ao mesmo duas FKs, que apontam para tabelas diferentes.

Não creio que seria possível "embutir" uma inteligencia na FK, que só seria ativada/válida para a coluna se determinadas condições fossem atendidas dentro do registro.

Eu optaria pela criação dos dois campos (do tipo NULL), cada uma delas com uma FK apontando para a tabela correta (NOTA ou PEDIDO). Criar um campo genérico que armazenaria informações diferentes (Pedido ou Nota Fiscal) talvez tornasse a manutenção confusa para os futuros desenvolvedores ou mantenedores desta base.

Mas se você realmente deseja seguir este caminho, talvez você possa criar uma "integridade inteligente" através de uma trigger (FOR EACH ROW BEFORE INSERT OR UPDATE). Neste caso você não precisaria da FK.

Ao fazer INSERT ou UPDATE nas colunas ID_PROCESSO e/ou TIPO_PROCESSO, esta trigger verificaria o valor destes campos e faria uma busca em NOTA ou PEDIDO, conforme o valor de TIPO_PROCESSO.

Caso não encontrasse a NOTA ou o PEDIDO, a trigger geraria uma mensagem de erro para o usuário, abortando a operação de UPDATE ou INSERT.

Espero ter contribuido para que você encontre uma solução para seu problema.

Abraços,

Sergio Coutinho
Freidinger
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 30 Nov 2011 2:10 pm

Olá Coutinho, tudo bem?

Obrigado pela resposta.
Eu removi as constraints das FK, e está tudo ocorrendo normalmente.
Só achei que tendo a fk, garantiria melhor a integridade entre as tabelas, mas, dessa forma que eu gostaria, não vai funcionar, infelizmente.

Eu criei uma trigger para salvar os campos mas, sem ter as fks e está ocorrendo tudo normal.

Obrigado pela ajuda de qualquer forma.

Abraços.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes