我继承了一个具有288个表的特定模式的数据库。这些表的所有完全都是相同的列名。我想在1中合并所有这288个表。
我的第一次尝试是CREATE TABLE AS
:
CREATE TABLE bigTable AS SELECT X.* FROM (SELECT tablename FROM pg_tables WHERE tablename LIKE '%xxx') AS X
但这显然不起作用。
所以我尝试使用plpgsql脚本:
DO $$
DECLARE
r RECORD;
BEGIN
FOR r in (SELECT tablename FROM pg_tables WHERE tablename LIKE '%iti') LOOP
INSERT INTO xxx(gid, shape_len, geom)
SELECT * FROM r;
END LOOP;
END;
$$;
但它告诉我,它不知道r
是什么。
我想我错过了关于pg如何处理这类事情的事情。
答案 0 :(得分:0)
使用此shell脚本获取所有表并插入新表
#!/bin/bash
psql **DATABASE_NAME** -c "select tablename from pg_tables where
schemaname='public'" | sed 1,2d | head -n -2 > hello.out
while read line;
do
psql **DATABASE_NAME** -c "insert into **TABLE_NAME** (select * from $line )"
done < hello.out
答案 1 :(得分:0)
当您动态创建语法时,请使用Execute
命令执行随字符串数据提供的SQL。
我刚刚制作了3个带有示例值的表,并使用此语句填充了第4个表
DO $$
DECLARE
tbl_name text;
BEGIN
FOR tbl_name IN (SELECT tablename FROM pg_tables WHERE tablename LIKE 'table%') LOOP
execute 'INSERT INTO table4 select * FROM '||tbl_name;
END LOOP;
END;
$$