数据库更新订单

时间:2009-03-23 18:27:36

标签: database postgresql

我遇到了数据库中的情况,我需要将一些记录的时间戳移动一天,但是我有一个唯一的约束,要求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。

2 个答案:

答案 0 :(得分:3)

您是否可以在更新期间删除约束,然后在完成后将其重新添加?

答案 1 :(得分:0)

我最近有一个类似的问题 - 我的测试数据已于2008年9月结束,我需要它更新近。我把它搬了六个月,但有一些重复。我需要做的是在创建重复项之前检测它们,并对现有行执行UPDATE而不是新行的INSERT。