我遇到了数据库中的情况,我需要将一些记录的时间戳移动一天,但是我有一个唯一的约束,要求id字段和时间戳字段是唯一的。
以下是表格说明。
Table "public.eedata" Column | Type | Modifiers -------------+--------------------------------+------------------------------------------------------------ eedata_id | bigint | not null default nextval('eedata_eedata_id_seq'::regclass) user_id | integer | eeupload_id | bigint | eetimestamp | timestamp(0) without time zone | Indexes: "pk_eedata" PRIMARY KEY, btree (eedata_id) "eedata_user_id_key" UNIQUE, btree (user_id, eetimestamp) "fki_eeuploadid" btree (eeupload_id) Foreign-key constraints: "fk_eeupload_id" FOREIGN KEY (eeupload_id) REFERENCES eeupload(eeupload_id) ON UPDATE CASCADE ON DELETE CASCADE "fk_user_id" FOREIGN KEY (user_id) REFERENCES users(user_id) ON UPDATE CASCADE ON DELETE CASCADE
这种情况下的问题是由eedata_user_id_key约束引起的。我可以使用
成功减去一天update eedata set eetimestamp = eetimestamp - interval '1 day' where eeupload_id = xxx;
因为它应用更新的顺序可以防止任何冲突,但是当我尝试
时update eedata set eetimestamp = eetimestamp + interval '1 day' where eeupload_id = xxx;
我得到了
ERROR: duplicate key violates unique constraint "eedata_user_id_key"
我需要做的是指定应用更新的顺序(实际上是更新语句的顺序)或暂停单个更新语句的约束的能力。
如果重要的话,我正在使用Postgres 8.1.11。
答案 0 :(得分:3)
您是否可以在更新期间删除约束,然后在完成后将其重新添加?
答案 1 :(得分:0)
我最近有一个类似的问题 - 我的测试数据已于2008年9月结束,我需要它更新近。我把它搬了六个月,但有一些重复。我需要做的是在创建重复项之前检测它们,并对现有行执行UPDATE而不是新行的INSERT。