Re: [pgbr-geral] Problemas no UPSERT

2016-04-27 Por tôpico Alan Tavares
Consegui solucionar meu problema de uma maneira até que simples deixo
abaixo um exemplo da solução para caso alguém no futuro necessite.



ALTER TABLE vendas.pedidos DROP CONSTRAINT pk_vendas_pedidos_id;

CREATE INDEX idx_vendas_pedidos_id ON vendas.pedidos USING btree (id);

ALTER TABLE vendas.pedidos ALTER COLUMN id DROP DEFAULT;
ALTER TABLE vendas.pedidos ALTER COLUMN id DROP NOT NULL;

CREATE OR REPLACE FUNCTION vendas.fn_pedidos_id()
RETURNS TRIGGER AS $$
BEGIN
UPDATE vendas.pedidos
SET id = nextval('vendas.pedidos_id_seq'::regclass)
WHERE id_origem = NEW.id_origem
AND cod_origem = NEW.cod_origem;
RETURN new;
END
$$
LANGUAGE PLPGSQL;


CREATE TRIGGER tg_pedidos_id AFTER INSERT
ON vendas.pedidos  FOR EACH ROW
EXECUTE PROCEDURE
vendas.fn_pedidos_id();





Em 26 de abril de 2016 11:29, Alan Tavares  escreveu:

> Ok obrigado vou ver o que faço
>>
>
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Problemas no UPSERT

2016-04-26 Por tôpico Alan Tavares
>
> Ok obrigado vou ver o que faço
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Problemas no UPSERT

2016-04-26 Por tôpico Alan Tavares
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 
escreveu:

> Em 26 de abril de 2016 11:09, Alan Tavares 
> 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
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Problemas no UPSERT

2016-04-26 Por tôpico Rafael Fialho
Em 26 de abril de 2016 11:09, Alan Tavares  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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Problemas no UPSERT

2016-04-26 Por tôpico Guimarães Faria Corcete DUTRA , Leandro
2016-04-26 11:09 GMT-03:00 Alan Tavares :
> Estou com um problema no UPSERT estou usando o PG 9.5 e usando o recurso
[…]

Não consegui entender.  Pode pontuar e separar frases, talvez
parágrafos, para a gente ver se entende?

Obrigado antecipadamente.


-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
+55 (61) 9302 2691ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT−3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] Problemas no UPSERT

2016-04-26 Por tôpico Alan Tavares
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.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral