- Este tópico contém 9 respostas, 5 vozes e foi atualizado pela última vez 17 anos, 3 meses atrás por
mpvargas.
-
AutorPosts
-
9 de dezembro de 2008 às 8:41 pm #84198
mpvargas
ParticipantePreciso alimentar um campo de uma tabela através da subtração de dois outros campos. Como posso fazer isso?
Exemplo:TABELA TESTE
CAMPO 1 (number)
CAMPO 2 (number)NOVO CAMPO = CAMPO 2 – CAMPO 1
Qual é a melhor forma de fazer isso, levando em consideração que a tabela tem +ou- 50.000 linhas?
9 de dezembro de 2008 às 8:45 pm #84199Manoel872
ParticipanteUPDATE TESTE SET NOVO CAMPO = CAMPO 2 – CAMPO 1
Seria isso… como deve ser para tabela inteira acredito que seja assim, causando um full table scan de preferência…
9 de dezembro de 2008 às 9:18 pm #84200mpvargas
ParticipanteObrigado pela ajuda.
Seria algo assim… mas eu tenho como fazer que esse campo receba esses valores automaticamente, ou só é possível numa aplicação?
Digo, quando inseridos novos valores nos campos 1 e 2, o novo campo seria preenchido automaticamente com a subtração.9 de dezembro de 2008 às 9:29 pm #84201Ishii
ParticipanteOlá
Use uma trigger…
Algo do tipo:
:new.novacoluna = campo1 - campo2;[]s Ishii
9 de dezembro de 2008 às 11:33 pm #84215mpvargas
ParticipanteObrigado Ishii.
Valeu pela dica, mas você poderia me ajudar na sintaxe, pois tenho pouco conhecimento sobre triggers. Seria +ou- assim:CREATE TRIGGER trig1
AFTER INSERT ON emp
FOR EACH ROW
BEGIN
novacoluna = campo1 – campo2;
END trig1;
end;
/Estou na dúvida de como colocar o campo calculado.
E como faço para aplicar a trigger? É só criar no banco?9 de dezembro de 2008 às 11:37 pm #84216Marcio68Almeida
ParticipanteUma questão filosófica…
Por que você quer uma coluna calculada baseada em outras colunas da mesma tabela ??? Não é um desperdício de espaço ???Mas… Respondendo…
Você deve colocar total = :new.coluna1 – :new.coluna29 de dezembro de 2008 às 11:47 pm #84219juliano_sf
ParticipanteOlha,
Não sei o real motivo dele, mas criar uma coluna pré-calculada reduziria o I/O necessário para buscar as 2 colunas e a CPU necessária para subtraí-las. Além disso, ele poderia criar um índice nessa coluna e pesquisar por ela…
Porem…
Podem haver problemas de integridade (ex: update em um dos valores envolvidos no cálculo) e aumentaria o custo em cpu de um insert por causa da trigger (o que geralmente não impacta muito, a não ser que seja realizada uma carga de inserts muito grande)
Att,
10 de dezembro de 2008 às 4:22 pm #84232mpvargas
ParticipanteEu sei que não é muito comum fazer isso, mas foi uma solicitação de um Analista. Temos um relatório padrão no ERP e o diretor pediu mais um campo, o Analista me perguntou se era possível fazer isso direto no banco, aí eu resolvi pesquisar… porque isso sendo possível poderíamos ter uma solução sem precisar mexer na aplicação, bastaria criar esse campo e ao ler a tabela o valor já estaria lá calculado automaticamente.
10 de dezembro de 2008 às 9:02 pm #84236juliano_sf
ParticipanteVocê pode também fazer uma view, mas aí você perde todos os beneficios de pré-calcular o resultado…
create view vw_xxx as
select campo1, campo2, (campo1 – campo2) as campo3
from xxx;Juliano
11 de dezembro de 2008 às 9:55 pm #84252mpvargas
ParticipanteJuliano, valeu pela dica.
Também é uma boa idéia. -
AutorPosts
- Você deve fazer login para responder a este tópico.