如何更新没有任何数据的行以唯一标识该行?
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 解密给再见”因为必须添加一些其他知识 - 知识也可以唯一地标识行。如果事情如你所说,你不需要关心哪个是什么;要么两者都是,你可以检索到原始数据进行重新加密,或者你不能。
【讨论】:
以上是关于如何更新没有任何数据的行以唯一标识该行?的主要内容,如果未能解决你的问题,请参考以下文章
已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行,如何解决