【问题标题】:How to find all identical tables by content in PostgreSQL database?如何在 PostgreSQL 数据库中按内容查找所有相同的表?
【发布时间】:2018-01-31 02:20:51
【问题描述】:

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

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

不适合按表架构搜索,因为所有表都具有相同的表架构。我正在使用 PostgreSQL 10。
我一直在寻找解决方案,但仍然没有结果。也许有人尝试过类似的东西。

【问题讨论】:

  • 你在说多少张桌子?你事先知道表名和列名吗?这是否必须在一个语句中完成?这是一次性的活动,还是重复的活动?为什么有“许多”不同名称的表具有相同的结构和匹配的内容?您可以添加的信息越多越好;目前,这是一个非常广泛的问题,您不太可能得到具体或有用的答案。

标签: sql database postgresql


【解决方案1】:

您可以将每个表复制到 csvs,没有标题,相同的分隔符。具有相同大小(或哈希)的 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 相同(令人惊讶)

【讨论】:

  • 不同因素可能意味着相同的数据以不同的顺序存储在表中,从而为生成的文件产生不同的哈希结果。
  • 当然。我的解决方案只适合不同的表名和列名。在阅读 OP 后我认为是这种情况
  • 这个方法会新建600个表吗?
  • 否 - 它将表格内容复制到 csv 文件。我创建表格只是为了演示它是如何工作的
  • 以前从未这样做过。只需在 SQL 查询工具中执行此查询即可?
【解决方案2】:

只是一个想法。

检查每张表的第N行的hash值是否相同。

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

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

【讨论】:

  • 我不会一一检查我所有的 600 张桌子。抱歉,这不是好的解决方案。
  • 我认为这是不同的功能。因为现在我应该为所有表创建函数来比较它们。
猜你喜欢
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2011-03-20
  • 2010-12-29
  • 2011-02-13
  • 2016-03-14
相关资源
最近更新 更多