Eu tenho uma tabela Pedidos que possui uma coluna Quantidade. Durante o check in ou check out, precisamos atualizar a coluna Quantidade por um. Existe uma maneira de fazer isso em uma ação ou temos que obter o valor existente e, em seguida, adicionar ou menos um em cima dele?
Outra questão é quando inserimos uma nova linha, precisamos verificar se os mesmos dados existem e, em seguida, inserir se não, que são duas etapas, ou existe uma maneira melhor de fazer isso?
obrigado,
A resposta em uma única etapa para a primeira pergunta é usar algo como:
Essa é uma maneira de fazer isso com uma única instrução.
Quanto à segunda pergunta, você não deve precisar recorrer à ginástica SQL específica do DBMS (como
UPSERT
) para obter o resultado desejado. Existe um método padrão para atualizar ou inserir que não requer um DBMS específico.Ou seja, você tenta fazer a criação primeiro. Se já estiver lá, ignore o erro. Caso contrário, você o cria com um valor 0.
Em seguida, faça a atualização que funcionará corretamente se:
Não é uma única instrução e ainda, surpreendentemente, é como temos feito isso com sucesso por muito tempo.
fonte
Se meu entendimento estiver correto, as atualizações devem ser bem simples. Eu apenas faria o seguinte.
Você pode precisar de filtros adicionais para atualizar apenas uma única linha em vez de todas as linhas.
Para inserções, você pode armazenar em cache algum id exclusivo relacionado ao seu registro localmente, verificar nesse cache e decidir se deseja inserir ou não. A abordagem alternativa é sempre inserir e verificar se há erros de violação de PK e ignorar, uma vez que esta é uma inserção redundante.
fonte
Pelo que eu sei, não há suporte integrado para INSERT-OR-UPDATE no SQL. Eu sugiro criar um procedimento armazenado ou usar uma consulta condicional para conseguir isso. Aqui você pode encontrar uma coleção de soluções para diferentes bancos de dados.
fonte
para responder a segunda:
torne a coluna exclusiva e capture a exceção se ela estiver definida com o mesmo valor.
fonte
@dotjoe É mais barato atualizar e verificar @@ rowcount, faça uma inserção após o fato.
As exceções são caras e as atualizações são mais frequentes
Sugestão: Se você quiser ter um ótimo desempenho em seu DAL, faça com que o front end passe um ID exclusivo para a linha a ser atualizada, se inserir nulo.
Os DALs devem ser CRUD e não precisam se preocupar em não ter estado.
Se você torná-lo sem estado, com bons índices, você não verá uma diferença com a seguinte instrução SQL vs 1. IF (selecione o primeiro * formulário x onde PK = @ ID) Insira outra atualização
fonte