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
