【问题标题】:Database Update Order数据库更新顺序
【发布时间】:2010-10-15 01:11:32
【问题描述】:

我在我们的数据库中遇到了一种情况,我需要将多条记录的时间戳移动一天,但是我有一个唯一约束,要求 id 字段和时间戳字段是唯一的。

这是表格说明。

表“public.eedata”
   专栏 |类型 |修饰符
-------------+--------------------------------+--- -------------------------------------------------- --------
 eedata_id |大整数 |不为空默认 nextval('eedata_eedata_id_seq'::regclass)
 用户 ID |整数 |
 eeupload_id |大整数 |
 eetimestamp |没有时区的时间戳(0)|
索引:
    “pk_eedata”主键,btree (eedata_id)
    "eedata_user_id_key" 唯一,btree (user_id, eetimestamp)
    “fki_eeuploadid” btree (eeupload_id)
外键约束:
    "fk_eeupload_id" 外键 (eeupload_id) 参考 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 约束引起的。我可以使用成功减去一天,

更新 eedata 集 eetimestamp = eetimestamp - 间隔 '1 天' where eeupload_id = xxx;

因为它应用更新的顺序可以防止任何冲突,但是当我尝试时

更新eedata set eetimestamp = eetimestamp + 间隔'1天' where eeupload_id = xxx;

我明白了

错误:重复键违反唯一约束“eedata_user_id_key”

我需要做的是指定应用更新的顺序(实际上是更新语句的顺序)或暂停单个更新语句的约束的能力。

如果这很重要,我正在使用 Postgres 8.1.11。

【问题讨论】:

    标签: database postgresql


    【解决方案1】:

    您能否在更新期间删除约束,然后在完成后重新添加?

    【讨论】:

    • 那会给他留下重复的,不是吗?
    • 这样就好了,可能是我需要走的路,但我想看看有没有更优雅的方式在接受之前处理它。
    • 不应该。如果他当前的状态是有效的,他的命令将增加一天。因为在更新过程中他将处于临时无效状态,所以在此之前不检查规则的有效性来绕过问题。我知道在 Oracle 中,您可以推迟检查更新直到提交...
    • 在查看 Postgres 文档后,看起来他们只支持外键约束的可延迟。在这一点上看起来最好的选择是在更新期间移除约束。
    【解决方案2】:

    我最近遇到了类似的问题 - 我有 2008 年 9 月结束的测试数据,我需要它是更新的。我把它移了六个月,但有一些重复。我需要做的是在创建重复之前检测它们,并更新现有行而不是插入新行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多