2012/5/30 Anselmo Silva <[email protected]> > 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; >
Independente do DEFERRED, tem um erro de lógica aí (por causa do WHERE). Você está atualizando (no primeiro update) o registro com id=1, no segundo update você "reatualiza" o mesmo registro (e o outro) já que para ele ordem passa a ser 2, daí nem com deferred vai resolver. 2012/5/30 Leandro Guimarães Faria Corcete DUTRA <[email protected]> > > Acho que continua no TODO, já viu essa página? > > Na verdade essa funcionalidade já existe, mas tem que usar uma chave UNIQUE e não um índice. Exemplo: CREATE TEMP TABLE TESTE (id serial not null, codvenda integer, ordem integer); ALTER TABLE teste ADD CONSTRAINT uk_codvendaordem UNIQUE (codvenda, ordem) DEFERRABLE INITIALLY DEFERRED; Agora da seguinte forma funciona (considerando que os id's estão certos): BEGIN; UPDATE teste SET ordem = 2 WHERE id = 1; UPDATE teste SET ordem = 1 WHERE id = 2; COMMIT; Atenciosamente, -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCAD<http://www.lcad.icmc.usp.br/> Instituto de Ciências Matemáticas e de Computação - ICMC<http://www.icmc.usp.br/> Universidade de São Paulo - USP <http://www.sc.usp.br/>
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
