MySQL - Update condicional

7 respostas
H

Pessoal,

Preciso fazer um update que seja dessa forma (não sei a sintaxe correta, então aí vai um pseudocódigo):
UPDATE produto SET nome = ‘nome’, preco = ‘preco’, IF validade NOT NULL (validade = ‘validade’) WHERE id = ‘id’

Explicando melhor, quero que o campo validade receba o valor que eu informar APENAS se ele não for NULL.
Eu não posso fazer da seguinte forma:
UPDATE produto SET nome = ‘nome’, preco = ‘preco’, validade = ‘validade’ WHERE id = ‘id’ AND validade NOT NULL
porque se a validade não for null nenhuma coluna vai ser atualizada.

A ideia é mudar todas as outras e colocar a condição SOMENTE naquele campo específico da validade.
Como posso fazer isso?

Grato!

7 Respostas

V

Não é melhor fazer duas queries?

Além disso, que tal começar a postar tópicos sobre banco de dados no fórum de persistência? Seu tópico nem sequer de Java é, quanto mais, básico.

Tópico movido.

A

Você pod utilizar um case:

UPDATE produto SET nome = 'nome', preco = 'preco',  validade = CASE WHEN validade IS NULL THEN NULL ELSE 'validade'  END WHERE id = 'id' ;
W

mysql:

UPDATE produto SET nome = 'nome', preco = 'preco', validade = IF(suavariavelvalidade=null, validade /* valor atual */, suavariavelvalidade /* novo valor */) WHERE id = 'id'

fonte: http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if

V

Eu ainda faria o teste com 2 queries. Planos de execução envolvendo IF e CASE geralmente são desastrosos.

A

De maneira geral, concordo contigo.

Neste caso, acredito que como o Where é feito baseado na PK da tabela, o custo não será tão alto.
(Assumindo que id seja a PK da tabela).

Infelizmente, não tenho mysql instalado aqui pra comprovar isso.

W

De maneira geral, concordo contigo.

Neste caso, acredito que como o Where é feito baseado na PK da tabela, o custo não será tão alto.
(Assumindo que id seja a PK da tabela).

Infelizmente, não tenho mysql instalado aqui pra comprovar isso.

com duas queries é o mais correto (mas se você tiver que ir no banco muitas vezes, não fará sentido você ir uma vez para cada registro, varia de acordo com o requisito :slight_smile: ). Não sei no mysql, mas em um banco de dados grande, o IF/SWITCH nunca seria resolvido antes do WHERE resolver :o)

[]'s

P

COALESCE não resolve o problema?

Criado 30 de janeiro de 2012
Ultima resposta 30 de jan. de 2012
Respostas 7
Participantes 5