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

Responder a