我正在尝试使用postgresql COPY命令从CSV加载一些数据。诀窍是我想在userid上实现多租户(包含在CSV中)。在加载csv时,是否有一种简单的方法可以告诉postgres copy命令根据此用户ID进行过滤?
即。 userid = x的所有行转到schema = x,userid = y的行转到schema = y。
答案 0 :(得分:2)
没有办法只使用COPY命令执行此操作,但您可以将所有数据复制到主表中,然后将一个简单的PL / PGSQL函数放在一起,为您执行此操作。像这样的东西 -
CREATE OR REPLACE FUNCTION public.spike()
RETURNS void AS
$BODY$
DECLARE
user_id integer;
destination_schema text;
BEGIN
FOR user_id IN SELECT userid FROM master_table GROUP BY userid LOOP
CASE user_id
WHEN 1 THEN
destination_schema := 'foo';
WHEN 2 THEN
destination_schema := 'bar';
ELSE
destination_schema := 'baz';
END CASE;
EXECUTE 'INSERT INTO '|| destination_schema ||'.my_table SELECT * FROM master_table WHERE userid=$1' USING user_id;
-- EXECUTE 'DELETE FROM master_table WHERE userid=$1' USING user_id;
END LOOP;
TRUNCATE TABLE master_table;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
这将从master_table获取所有唯一的user_id,使用CASE语句确定目标模式,然后执行INSERT SELECT以移动行,最后删除移动的行。