2008-11-28 8 views
0

J'ai une table avec deux colonnes sont une clé unique ensemble et je ne peux pas changer le schéma.Utiliser psql pour lancer une mise à jour

J'essaie d'exécuter une mise à jour en utilisant psql dans laquelle je change la valeur de l'une des colonnes qui sont clés. Le script est similaire à ce qui suit:

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

En utilisant psql avec la commande:

psql -U user -f file 

J'ai l'erreur

ERROR: duplicate key violates unique constraint "<key_name>" 

Mais la colonne est dans la clé avec une autre colonne et le changer ne «brise» aucune contrainte unique. La même requête à l'intérieur de pgAdmin3 fonctionne correctement sans erreurs.

Je ne suis pas un dba il me semble qu'il me manque quelque chose d'évident.

Merci

Répondre

0

hmm, et si vous:

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

vous ne recevez pas de lignes en double?

tu fais

BEGIN; 
... 
COMMIT; 

lors de l'utilisation pgadmin ainsi?

+0

J'ai trouvé l'erreur, je ne faisais pas BEGIN .. COMMIT dans pgAdmin. Merci! – egesuato

0

Pouvez-vous tapez la commande suivante dans psql et ajouter la sortie à votre question?

\d schema.table 
0

est ici la sortie:

   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) 

Les deux colonnes sont les touches idnazione et partitaiva (ainsi que nextego mais est toujours égal à -1).

+0

Veuillez ajouter les véritables instructions de mise à jour. –

0

La véritable déclaration de mise à jour est:

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; 

La colonne « idnazione » est différent dans chaque ligne et plus importante la même déclaration en pgAdmin3 fonctionne très bien.