On Mon, Apr 9, 2012 at 10:51 AM, Tulio Santos <[email protected]>wrote:

> Olá,
>
> Não sei se entendi bem sua duvida, mas confira os exemplos no link[1]
>
> [1] - http://www.postgresql.org/docs/8.1/static/sql-insert.html
>
> Att,
> Tulio
>
>   ------------------------------
> *De:* Raphael Mattos <[email protected]>
> *Para:* [email protected]
> *Enviadas:* Segunda-feira, 9 de Abril de 2012 10:30
> *Assunto:* [pgbr-geral] Insert or Update
>
>
> Olá, sou novo no mundo Postgresql, e gostaria de saber se existe algum
> comando para inserir ou atualizar de uma única vez como no Mysql .
> No MySQL, por exemplo, vc pode usar o comando:
> Insert cliente (id,codigo, nome) values (1,'000001', 'José')
> on duplicate key update
>     nome = 'José da Silva';
> --
> *Raphael Filipe Mattos *
> *        Desenvolvimento*
>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
Não. O PostgreSQL não possui upsert, apesar de que há muitas discussões nas
listas para implementar-se o comando MERGE.

Mas, claro que existem alternativas. Uma que gosto bastante é realizar um
UPDATE primeiro e verificar quais as tuplas NÃO foram atualizadas, dá pra
fazer isso com um único comando (apesar de meio grandinho). Ex:

with vals (id, codigo, nome) as (
    -- Valores que serão inseridos ou atualizados (pode ser mais de um:
union all)
    values(1, '000001', 'José')
    union all
    values(2, '000002', 'João')
), updated (id) as (
    -- Faz um update e retorna apenas os ID's que foram atualizados
    update cliente
    set codigo = v.codigo,
        nome = v.nome
    from vals v
    where cliente.id = v.id
    returning cliente.id -- retorna os ID's
)
-- Insere somente os que não foram atualizados (not in)
insert into cliente(id, codigo, nome)
select * from vals
where id not in (
    select id from updated -- O update de fato só acontece mesmo aqui
);


Veja se deu pra entender.

Att.
--
Matheus de Oliveira

Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho -
LCAD<http://www.lcad.icmc.usp.br/>
Instituto de Ciências Matemáticas e de Computação -
ICMC<http://www.icmc.usp.br/>
Universidade de São Paulo - USP <http://www.sc.usp.br/>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a