更新主键而不创建重复行?

时间:2017-05-24 09:33:50

标签: java mysql database hash

我正在研究一个Java项目,该项目需要能够改变表中的所有主键 - 在大多数情况下 - 也可以改变行中的其他一些值。 我遇到的问题是,如果我通过选择旧的主键来更新行(SET pk = new_pk WHERE pk = old_pk),我会得到重复的行(因为旧的PK值可能等于另一行的新行)然后更新PK值和两行。

我认为在Oracle和其他一些数据库中我可以用ROWNUM或类似的东西来做这件事,但是系统应该适用于大多数数据库系统,而现在我们无法让它适用于MySQL。

我应该补充一点,我无权更改数据库的架构 - 因此,我无法添加列。

我尝试过:

  • 使用RS.updateRow()直接更新ResultSet - 这似乎是 工作,但很慢。
  • 哈希表中的PK,将哈希值存储在代码中并选择哈希值PK。这有点像签名,因为a 散列PK表示该行已被读取但尚未更新 我可以通过这种方式避免适当的行。看来这个问题 因为我得到了重复的PK,所以一直是哈希冲突。

PS: 我意识到这听起来像是一个糟糕的想法,或者是糟糕的设计,但我们别无选择。我正在研究的系统旨在匿名私有数据,这可能需要在某些表中更改PK。不要害怕,我们会考虑FK参考。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用简化更新,其中delta = max Pk来自更新表

选择delta

select max(pk) as delta from table

然后在查询中使用它

update table SET pk=pk+delta+1

在此操作之前,您需要禁用约束。并且不要忘记你也应该更新外键。