INSERT INTO vendas.pedidos(id_origem, cod_origem, valor,
frete, taxas, status,status_origem, dt_pedido, dt_entrega)
SELECT
id_origem,
origem_id as cod_origem,
valor_pedido as valor,
valor_frete as frete,
'{}'::json as taxas,
'processando' as status,
status as status_origem,
data_compra as dt_pedido,
data_compra  as dt_entrega
FROM b2w.alt_orders
ON CONFLICT (id_origem,cod_origem)
DO UPDATE SET status_origem = EXCLUDED.status_origem;

Basicamente essa é a minha rotina que esta numa function

A tabela alt_orders é uma tabela do sistema antigo e recebe todos os
pedidos de uma das plataformas de venda.
A tabela pedidos é a tabela que agrega todos os pedidos das diversas
plataformas de venda.

Acontece que sempre que essa rotina é executada mesmo não acontecendo um
insert na tabela pedidos o id que é um serial é incrementado.

Gostaria que somente fosse incrementado o id quando fosse efetivamente um
insert porque ao fazer um select na tabela pedidos não esta com o id serial
pois conforme ocorre o conflito há o incremento da sequencia. O que faz com
que os ids da tabela pedidos fique assim

1
2
3
10
11
17
30

Em 26 de abril de 2016 11:20, Rafael Fialho <[email protected]>
escreveu:

> Em 26 de abril de 2016 11:09, Alan Tavares <[email protected]>
> escreveu:
>
>> Estou com um problema no UPSERT estou usando o PG 9.5 e usando o recurso
>> insert on conflict do ...
>> tenho uma tabala de pedidos com um id serial e uso isso para fazer
>> referencia do pedido no sistema.
>> Acontece que quando recebo uma notificação de venda uso esse recurso do
>> UPSERT para inserir se for um novo pedido
>> e se ja existir fazer um update no status do pedido. O problema é que
>> quando isso ocorre o id é incrementado mesmo ocorrendo o update ou não
>> fazendo nada
>> existe alguma maneira facil de só incrementar se houver realmente um
>> insert.
>>
>
> Como campos serial possuem como default o "nextval" da sequence, esse
> valor é incrementado mesmo quando rodas um "insert into" e qualquer tipo de
> erro ocorre. O rollback não "decrementa" o valor da sequence, logo o
> comportamento está de acordo com o padrão já existente antes do recurso "on
> conflict".
>
> Como provavelmente ocorre um erro por baixo, que é tratado pelo "on
> conflict", o incremento da sequence ocorre naturalmente.
>
> O que poderia fazer, talvez, seria uma PL para fazer esse upsert
> manualmente, se você não quer que este comportamento ocorra, verificando se
> irá fazer o insert ou update e deixando de utilizar o recurso. Não creio
> que seja um caso de bug ou problema no recurso, talvez uma possível
> melhoria.
>
> Espero ter ajudado.
>
> []'s
>
> _______________________________________________
> 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

Responder a