我想更新表中几行的主键。如果更新了所有行,则键将再次唯一,但第一行的更新将导致与第二行的键发生临时冲突。有没有一个优雅的方法来解决这个问题?
例子:
create table erichtest ( i integer, v varchar(200) );
alter table erichtest add constraint pk_erichtest primary key(i);
insert into erichtest values(1, 'Eins');
insert into erichtest values(2, 'Zwei');
update erichtest set i=i+1;
错误:重复的键值违反了唯一约束“pk\u erichtest”
最佳答案
Something like this should help:
b=# begin;
BEGIN
b=# alter table erichtest drop constraint pk_erichtest ;
ALTER TABLE
b=# alter table erichtest add constraint pk_erichtest primary key (i) DEFERRABLE INITIALLY IMMEDIATE;
ALTER TABLE
b=# set constraints pk_erichtest deferred ;
SET CONSTRAINTS
b=# update erichtest set i=i+1;
UPDATE 2
b=# select * from erichtest ;
i | v
---+------
2 | Eins
3 | Zwei
(2 rows)
b=# end;
COMMIT