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

标签 java mysql database hash

我正在开发一个 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/

相关文章:

php - 导入 Excel 文件时更新重复条目 - php mysql

database - 文件上传的免费服务器端防病毒/安全/木马保护?

mysql - 在两个表上进行 UNION ALL 后,如何删除/更新在其他表中具有类似 ID 的特定行?

java - 从套接字读取文件的正确方法是什么?

java - ?扩展 TSubject 扩展主题 - 类型不安全,或者只是 Java 无法处理它?

mysql - SQL更新多个表

c# - MySql:在if语句中选择

database - 如何使用 JayDeBeApi 连接到 Postgres?它没有找到 org.postgresql.Driver

java - 线性同余发生器给出错误的输出

java - 在java中一次执行多个 Elasticsearch 查询