Dado o seguinte:
-----------------------------------------------------------------------------
CREATE TEMP TABLE TESTE (id serial not null,
codvenda integer,
ordem integer);

CREATE UNIQUE INDEX ON teste (codvenda, ORDEM);

INSERT INTO TESTE (codvenda, ordem) values (1,1);
INSERT INTO TESTE (codvenda, ordem) values (1,2);

begin;
-- tentando inverter ordem na mesma transação
update teste set ordem = 2 where codvenda = 1 and ordem = 1;
update teste set ordem = 1 where codvenda = 1 and ordem = 2;

commit;
-----------------------------------------------------------------------------
Retorna o erro a seguir:

ERRO:  duplicar valor da chave viola a restrição de unicidade
"teste_codvenda_ordem_idx"
DETAIL:  Chave (codvenda, ordem)=(1, 2) já existe.

Resolvi atualizando para NULL o campo ORDEM dos dois, depois atualizando
novamente a ordem correta.

Minha questão é:
Alguém sabe se há alternativa melhor (mais estruturada, nativa) para que
tal erro não aconteça dentro de uma transação? Dropar o índice e recriá-lo
não vale

Li algo sobre índices com DEFERRED em 2006 [1]. Adiar um índice para o fim
da transação seria uma boa idéia, não?

há alguma informação mais recente sobre o assunto?

[1] http://www.depesz.com/2009/08/11/waiting-for-8-5-deferrable-uniqueness/
-- 
Anselmo M. Silva
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a