我正在开发一个 Java 项目,该项目需要能够更改表中的所有主键 - 在大多数情况下 - 还需要更改行中的一些其他值。 我遇到的问题是,如果我通过选择旧主键(SET pk=new_pk WHERE pk=old_pk)来更新行,我会得到重复的行(因为旧的 PK 值可能等于另一行的新 PK 值,并且两者然后更新行)。
我认为在 Oracle 和其他一些数据库中,我可能可以使用 ROWNUM 或类似的东西来做到这一点,但系统应该适用于大多数数据库系统,但现在我们无法让它适用于 MySQL。
我应该补充一点,我无权更改数据库的架构 - 因此,我无法添加列。
我尝试过的:
- 直接使用 RS.updateRow() 更新结果集 - 这似乎是 可以工作,但是速度很慢。
- 对表中的 PK 进行哈希处理,将哈希值存储在代码中并选择哈希后的 PK。这有点像签名,因为 散列 PK 表示该行已被读取但尚未更新 这样我就可以避免适当的行。这个问题似乎 因为我得到了重复的 PK,所以发生了哈希冲突。
PS: 我意识到这听起来要么是一个糟糕的想法,要么是糟糕的设计,但我们真的别无选择。我正在开发的系统旨在匿名化私有(private)数据,这可能需要更改某些表中的 PK。别担心,我们确实会考虑 FK 引用。
最佳答案
在这种情况下,您可以使用更新表中的 delta = max Pk 进行简单更新
选择增量
select max(pk) as delta from table
然后在查询中使用它
update table SET pk=pk+delta+1
在此操作之前,您需要禁用约束。并且不要忘记您还应该更新外键。
关于java - 更新主键而不创建重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44154510/