如何更新没有任何数据的行以唯一标识该行?

Posted

技术标签:

【中文标题】如何更新没有任何数据的行以唯一标识该行?【英文标题】:How to update a row without any data to uniquely identify the row? 【发布时间】:2020-04-06 06:12:57 【问题描述】:

我有一个包含一个文本列的表格(还有一些其他列。但它们在这里无关紧要)。此列中的值可以包含重复项。该表没有任何主键或其他唯一数据来单独标识每一行。

文本之前使用 Blowfish 算法加密。但我们现在计划使用 AES 加密文本。

所以我们从表中取出一批行,然后通过我们的 java 代码运行它,该代码执行从 Blowfish 到 AES 的转换。但是,由于我们没有唯一的键来识别行,我如何确保我们正在更新正确的列。

我可以想到两种方法来做到这一点。 1)向数据库添加一个自动递增的主键/唯一键。这虽然是理想的,但会导致我们的应用程序中的大量代码更改。 2) 以某种奇怪的方式使用 rownum 进行更新。我担心这种方法的数据完整性。

还有其他方法可以做到这一点吗?或者最好的方法是什么?

我们正在使用 Oracle SQL DB 和 JDBCTemplate。

【问题讨论】:

考虑使用oracle的rowid? 当心; rowid 可以更改,并且不应将其作为主键依赖,除非您愿意在它们更改中间操作时承担风险。 ***.com/questions/435109/… 【参考方案1】:

在您描述的情况下,我不确定您为什么关心;只需下载该行,解密它,删除它,重新加密它并插入新值。如果结果多行发生变化,那就这样吧;无论如何,您无法分辨它们以前是什么,并且您说行上没有其他东西可以唯一标识它,因此系统必须容忍丢失信息

我的意思是,假设您有两个文本值:

hello
goodbye

你对它们进行了加密,它们变得一样了:

1235
1235

要么其中一个现在丢失,解密 1235 将始终产生“hello”,要么解密后知道 1235 将产生“hello”或“goodbye” - 您可以同时运行这两个“hello” /"goodbye" 通过您的新算法生成唯一值 111 和 222,因此您可以安全地从表 (delete from t where enctext = 1235) 中删除所有 1235 并插入 111 和 222..

在表中重复 1235 并没有任何帮助(您不能说“这个 1235 解密给你好,但那个 1235 解密给再见”因为必须添加一些其他知识 - 知识也可以唯一地标识行。如果事情如你所说,你不需要关心哪个是什么;要么两者都是,你可以检索到原始数据进行重新加密,或者你不能。

【讨论】:

以上是关于如何更新没有任何数据的行以唯一标识该行?的主要内容,如果未能解决你的问题,请参考以下文章

已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行,如何解决

唯一标识符更改时如何更新表?

通过唯一标识符组合查询结果的行?

sql server"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 解决方案

如何在表中添加唯一标识符列?

如何获取Android唯一标识