2008-11-28 35 views
0

我有一個兩列的表是一個唯一的鍵,我不能改變模式。使用psql運行更新

我試圖執行一個更新使用psql在其中我更改了其中一個關鍵列的值。該腳本是類似如下:

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

使用PSQL用命令:

psql -U user -f file 

我已經得到了錯誤

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

但列是關鍵與另一列並改變它並不「打破」任何獨特的約束。 pgAdmin3中的查詢運行正常,沒有錯誤

我不是一個dba在我看來,我失去了明顯的東西。

感謝

回答

0

嗯,如果你:

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

你沒有得到任何重複的行?

您使用pgAdmin的時候也做

BEGIN; 
... 
COMMIT; 

+0

我發現了錯誤,我沒有在pgAdmin中做BEGIN .. COMMIT。 謝謝! – egesuato 2011-02-10 05:28:25

0

您可以鍵入PSQL以下和輸出添加到您的問題嗎?

\d schema.table 
0

這裏是輸出:

   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) 

兩列idnazione和partitaiva是鍵(與nextego在一起,但是這總是等於-1)。

+0

請添加真實的更新語句。 – 2008-12-01 13:36:49

0

真正的更新語句是:

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; 

列「idnazione」是每一行的不同,更重要的pgAdmin3同一個語句運行正常。