Использование 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, мне кажется, что я упускаю что-то очевидное.

Спасибо


person egesuato    schedule 28.11.2008    source источник


Ответы (4)


хм, а если вы:

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

у вас нет повторяющихся строк?

ты делаешь

BEGIN;
...
COMMIT;

при использовании pgadmin также?

person Arthur Thomas    schedule 01.12.2008
comment
Я нашел ошибку, я не делал BEGIN.. COMMIT в pgAdmin. Спасибо ! - person egesuato; 10.02.2011

Можете ли вы ввести следующее в psql и добавить вывод к своему вопросу?

\d schema.table
person Patryk Kordylewski    schedule 28.11.2008

Вот результат:

              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).

person egesuato    schedule 01.12.2008

Настоящее заявление об обновлении:

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 работает нормально.

person egesuato    schedule 01.12.2008