使用psql运行更新

时间:2008-11-28 11:34:33

标签: database postgresql

我有一个包含两列的表是一个唯一的键,我无法更改架构。

我正在尝试使用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,我错过了一些明显的东西。

由于

4 个答案:

答案 0 :(得分:0)

您可以在psql中键入以下内容并将输出添加到您的问题中吗?

\d schema.table

答案 1 :(得分: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)。

答案 2 :(得分: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中的相同语句运行正常。

答案 3 :(得分:0)

嗯,如果你:

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

你没有得到任何重复的行?

你正在做什么

BEGIN;
...
COMMIT;

同时使用pgadmin?