2008-11-28 48 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同一个语句运行正常。