Re: [pgbr-geral] Problemas no UPSERT
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 Tavaresescreveu: > 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
> > 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
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 Fialhoescreveu: > 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
Em 26 de abril de 2016 11:09, Alan Tavaresescreveu: > 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 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
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