Usando psql para executar uma atualização

votos
0

Eu tenho uma tabela com duas colunas são uma chave única juntos e eu não posso mudar o esquema.

Estou tentando executar uma atualização usando psql em que eu mudar o valor de um da coluna que são fundamentais. O script é semelhante ao seguinte:

BEGIN;
UPDATE t1 SET P1='23' where P1='33';
UPDATE t1 SET P1='23' where P1='55';
COMMIT;

Usando psql com o comando:

psql -U user -f file

Eu tenho o erro

ERROR: duplicate key violates unique constraint <key_name>

Mas a coluna está em chave com outra coluna e mudá-lo não quebrar qualquer restrição exclusiva. A mesma consulta dentro pgadmin3 funciona muito bem sem erros .

Eu não sou um dba parece-me que eu estou faltando algo óbvio.

obrigado

Publicado 28/11/2008 em 12:34
fonte usuário
Em outras línguas...                            


4 respostas

votos
0

você pode digitar o seguinte no psql e adicionar a saída para a sua pergunta?

\d schema.table
Respondeu 28/11/2008 em 20:20
fonte usuário

votos
0

Aqui está a saída:

              Tabella "public.partitaiva"

    Colonna     |          Tipo          | Modificatori

----------------+------------------------+--------------

 id             | bigint                 | not null

 idnazione      | bigint                 | not null

 partitaiva     | character varying(20)  | not null

 logicaldelete  | boolean                |

 prevego        | bigint                 |

 nextego        | bigint                 | not null

 lastmodified   | bigint                 |

 creationuser   | character varying(255) |

 creationtime   | bigint                 |

 lastmodifyuser | character varying(255) |

 version        | bigint                 |

Indici:

    "partitaiva_pkey" PRIMARY KEY, btree (id)

    "partitaiva_idnazione_key" UNIQUE, btree (idnazione, partitaiva, nextego)

Vincoli di integrità referenziale

    "fk2659231b8f0d2c9" FOREIGN KEY (idnazione) REFERENCES nazione(id)

As duas colunas idnazione e partitaiva são as chaves (em conjunto com nextego mas isto é sempre igual a -1).

Respondeu 01/12/2008 em 09:13
fonte usuário

votos
0

A verdadeira declaração de atualização é:

BEGIN;

UPDATE partitaiva SET partitaiva='02469480244' WHERE partitaiva='80911556878';
UPDATE partitaiva SET partitaiva='02469480244' WHERE partitaiva='75545502025';
UPDATE partitaiva SET partitaiva='02469480244' WHERE partitaiva='11056297226';

COMMIT;

A coluna "idnazione" é diferente em cada linha e mais importante é a mesma declaração em pgadmin3 funciona muito bem.

Respondeu 01/12/2008 em 15:14
fonte usuário

votos
0

hmm, e se você:

select idnazione, nextego 
from partitaiva 
where partitaiva='02469480244' 
order by idnazione, nextego;

você não obter quaisquer linhas duplicadas?

você esta fazendo

BEGIN;
...
COMMIT;

quando se utiliza pgadmin bem?

Respondeu 01/12/2008 em 21:43
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more