我有一个庞大的PostgreSQL数据库,它可能有几个具有相同内容的表(相同的排序),但名称可能不同。表列名称相同。通过运行新查询,可以在更新期间创建具有相同内容的表。数据库包含大约600个表。
我想问有没有办法自动找出内容相同的表名?
按表模式搜索不适合,因为所有表都具有相同的表模式。我正在使用PostgreSQL 10.
我一直在寻找解决方案,但仍然没有结果。也许有人尝试过类似的东西。
答案 0 :(得分:1)
你可以将每个表复制到csvs,没有标题,相同的分隔符。尽管有表/列名称,但具有相同大小(或散列)的csv文件将告诉您确切的内容......
假设我有这两个表:
$gte: ISODate("2017-10-08T00:57:06.563+0000")
所以我这样做:
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;
$$;
对我来说t1和t2是相同的(上面的loo)和tb1与tb2(令人惊讶的)
答案 1 :(得分:0)
只是一个想法。
检查每个表的第N行的哈希值是否相同。
然后对于找到的表,对许多不同的随机行进行相同的检查。
首先检查最后一个ID是否匹配。