1

我正在尝试使用 postgresql COPY 命令从 CSV 加载一些数据。诀窍是我想在用户标识(包含在 CSV 中)上实现多租户。在加载 csv 时,是否有一种简单的方法可以告诉 postgres 复制命令根据此用户 ID 进行过滤?

即所有带有userid=x 的行转到schema=x,带有userid=y 的行转到schema=y。

4

1 回答 1

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 移动行,最后删除移动的行。

于 2012-12-07T17:03:08.790 回答