在PostgreSQL中查找行的哈希值

44

在postgresql中,有没有一种方法可以获取行的哈希码?

我需要仅在数据自上次导出后发生更改时导出某些数据,最后导出的数据行可以存储在一个表中,当再次需要导出数据时,我可以获取所有数据的哈希值,并仅导出具有与上次导出不同哈希值的行。

是否可能使用postgresql实现此功能?

谢谢

2个回答

70

将行转换为文本,然后使用md5生成哈希值:

SELECT
    md5(CAST((f.*)AS text))
FROM
    foo f;

23
使用以下翻译:SELECT md5(f::text) FROM f意思是从 f 表中选择数据并将其转换为文本格式,然后计算其 MD5 哈希值。 - Jelen
@frank-heikens 有没有办法选择性地获取列并将它们转换为文本?例如- md5(CAST(col_1,col_2,col_3)AS text) - john mich
1
@johnmich 嗯,对我来说,在 postgres 12 下 md5((col_1 || col_2 || col_3)::text) 是可行的。 - datico
11
@johnmich @datico 注意!这种方式不同的列可能会产生相同的字符串,例如 '' || '' || 'a' = 'a' || '' || ''。最好使用 md5(row(col_1,col_2,col_2)::text) - cstork

6

另一种方法是设置一个ON INSERT OR UPDATE触发器,将当前时间戳插入last_modified列中,然后在导入过程运行时仅基于此列进行查询。


我面临的问题是我正在处理一个遗留系统,数据可以通过导入或添加/编辑页面进行输入,而所有数据的最后修改列都不可靠。这就是为什么我正在寻找某种哈希技术来检查是否有任何更改的原因。 - Arun P Johny
3
使用这种方法,数据库触发器将确定并写入"last_modified"时间 - 而不是客户端向该表中输入数据。客户端不会知道这个列存在,并且也不应该知道 - 您的数据库将自己管理它。 - matt b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接