Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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数据库中按内容查找所有相同的表?_Sql_Database_Postgresql - Fatal编程技术网

如何在PostgreSQL数据库中按内容查找所有相同的表?

如何在PostgreSQL数据库中按内容查找所有相同的表?,sql,database,postgresql,Sql,Database,Postgresql,我有一个巨大的PostgreSQL数据库,它可以有几个具有相同内容(相同顺序)的表,但名称可能不同。表列名称相同。在更新期间,可以通过运行新查询来创建具有相同内容的表。数据库包含大约600个表 我想问有没有办法自动找出内容相同的表的名称 按表架构搜索不适用于此,因为所有表都具有相同的表架构。我正在使用PostgreSQL 10。 我一直在寻找解决方案,但仍然没有结果。也许有人尝试过类似的东西 您可以将每个表复制到CSV,没有标题,使用相同的分隔符。具有相同大小(或散列)的csv文件将告诉您确切的

我有一个巨大的PostgreSQL数据库,它可以有几个具有相同内容(相同顺序)的表,但名称可能不同。表列名称相同。在更新期间,可以通过运行新查询来创建具有相同内容的表。数据库包含大约600个表

我想问有没有办法自动找出内容相同的表的名称

按表架构搜索不适用于此,因为所有表都具有相同的表架构。我正在使用PostgreSQL 10。

我一直在寻找解决方案,但仍然没有结果。也许有人尝试过类似的东西

您可以将每个表复制到CSV,没有标题,使用相同的分隔符。具有相同大小(或散列)的csv文件将告诉您确切的内容,不管表/列名如何

假设我有两张桌子:

o=# create table t1 (i int, t text);
CREATE TABLE
o=# insert into t1 select g,chr(g) from generate_series(1,999) g;
INSERT 0 999
o=# create table t2 (e int, p text);
CREATE TABLE
o=# insert into t2 select * from t1;
INSERT 0 999
因此,我:

do $$
declare _r record;
begin
 for _r in (select relname::regclass from pg_class where relname like 't%' and relkind = 'r') loop
   execute format($f$copy %I to '/tmp/%I'$f$,_r.relname, _r.relname);
 end loop;
end;
$$;
我检查:

-bash-4.2$ for i in $(ls -1 /tmp/t*); do echo "$(cat $i | md5sum) $i" ; done
d41d8cd98f00b204e9800998ecf8427e  - /tmp/t
44d8faf7b3b51a5db5f39d438dd26a60  - /tmp/t1
44d8faf7b3b51a5db5f39d438dd26a60  - /tmp/t2
26ab0db90d72e28ad0ba1e22ee510510  - /tmp/t3
c5113ddc78b11ff5f9a302c539ed54e2  - /tmp/t5
26ab0db90d72e28ad0ba1e22ee510510  - /tmp/ta
08b766f7b8e96abf07a9a92d92f98c01  - /tmp/tb
b026324c6904b2a9cb4b88d6d61c81d1  - /tmp/tb1
b026324c6904b2a9cb4b88d6d61c81d1  - /tmp/tb2
cf8685bf8567bbc2b07a825258f58b87  - /tmp/test
ceb91e258711d9f5bd05b97df2ed1626  - /tmp/testtable
d41d8cd98f00b204e9800998ecf8427e  - /tmp/tt
对我来说,t1和t2是相同的(上面的loo),tb1和tb2是相同的(令人惊讶的)

只是一个想法

检查每个表的第n行的哈希值是否相同

然后,对于找到的表,对多个不同的随机行执行相同的检查


首先检查最后一个id是否匹配

你在说多少张桌子?您事先知道表名和列名吗?这必须在一个语句中完成吗?这是一次性活动还是重复活动?为什么有“许多”名称不同的表具有相同的结构和匹配的内容?你能添加的信息越多越好;目前,这是一个非常广泛的问题,您不太可能得到具体或有用的答案。不同的因素可能意味着相同的数据存储在表中,但顺序不同,从而产生不同的哈希结果。我的解决方案只适合不同的表名和列名。在阅读OPD之后,我认为是这样的。这个方法会创建新的600个表吗?否-它会将表内容复制到csv文件中。我创建表格只是为了演示它是如何工作的,以前从未这样做过。在SQL查询工具中执行这个查询?我不会逐一检查我所有的600个表。很抱歉,这不是一个好的解决方案。请看这里:我认为这是不同的功能。因为现在我应该为所有表创建函数来比较它们。