Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 查找一组行的哈希值_Postgresql - Fatal编程技术网

Postgresql 查找一组行的哈希值

Postgresql 查找一组行的哈希值,postgresql,Postgresql,我的PostgresSQL数据库中有一个表person,其中包含不同用户的数据 我需要编写一个测试用例,以确保某些例程确实修改了用户1的数据,而不修改用户2的数据 为此,我需要 a) 计算用户1和用户2的所有行的哈希代码 b) 然后执行测试中的操作 c) 再次计算哈希代码,然后重试 d) 比较步骤a)和c)中的哈希代码 我找到了一个计算单行哈希代码的方法: SELECT md5(CAST((f.*)AS text)) FROM person f; 为了实现我的目标(找出用户2的行是否已更改),

我的PostgresSQL数据库中有一个表
person
,其中包含不同用户的数据

我需要编写一个测试用例,以确保某些例程确实修改了用户1的数据,而不修改用户2的数据

为此,我需要

a) 计算用户1和用户2的所有行的哈希代码

b) 然后执行测试中的操作

c) 再次计算哈希代码,然后重试

d) 比较步骤a)和c)中的哈希代码

我找到了一个计算单行哈希代码的方法:

SELECT md5(CAST((f.*)AS text))
FROM person f;
为了实现我的目标(找出用户2的行是否已更改),我需要执行如下查询:

SELECT user_id, SOME_AGGREGATE_FUNCTION(md5(CAST((f.*)AS text)))
FROM person f
GROUP BY user_id;
我可以使用什么聚合函数来计算一组行的哈希代码


注意:我只想知道用户2的任何行是否已更改。我不想知道到底发生了什么变化。

最简单的方法就是用
string\u agg
将所有的字符串形式
md5
。但要正确使用此聚合,必须指定
订单依据


或者使用
md5(string_agg(md5(CAST((f.*)AS text)),'')
和一些
ORDER BY
-如果
f.*
的任何字段发生变化,它会发生变化,比较起来很便宜。

一种更简单的方法

SELECT user_id, md5(textin(record_out(A))) AS hash
FROM person A

谢谢当我尝试使用
string\u agg
时,我收到错误消息
Function string\u agg不存在。
。“我用的是Postgres 9.2。”DmitriPisarenko说。官方手册说它存在。这里@DmitriPisarenko请立即尝试。我忘记了
string\u agg
的第二个参数,即分隔符。@DmitriPisarenko:您可以简化为
md5(f::text)
,因为您可以直接将复合表类型转换为
text