Postgresql删除复制命令的操作

时间:2014-12-15 01:04:32

标签: postgresql

我有这段代码

create or replace function foo(text)returns int as $$ begin
copy (select * from (delete from bar a where a.id not in(select b.id from bar b where a.id=b.id limit 32 offset 0) returning *) as g) to '/home/foo/.bar.data';
return 1;
end $$ language plpgsql cost 50;

但它无法创建函数并出现以下错误

ERROR:  syntax error at or near "from"
LINE 4: copy(select * from(delete from bar a ...
                                  ^
********** Error **********
ERROR: syntax error at or near "from"
SQL state: 42601
Character: 29

删除命令(delete from bar ...)在我单独调用时已准备好并运行完毕 我也试过这个(没有选择),同样的错误。

copy (delete from bar a where a.id not in(select b.id from bar b where a.id=b.id limit 32 offset 0) returning *) to '/home/foo/.bar.data';

我想要的只是从表中删除并复制到文件中 另外我怎样才能在pgsql中使用void方法?

2 个答案:

答案 0 :(得分:0)

看看这个: Using return value from DELETE for UPDATE in Postgres

接受的答案可能会指向正确的方向。看来在子查询中使用DELETE存在一些固有的PostgreSQL限制,可能会延伸到COPY。链接的问题专门讨论了在DELETE中使用UPDATE结果的复杂性,但提供的解决方法也适用于您的用例。

答案 1 :(得分:0)

您不能像这样使用COPY,因为语法不支持使用子查询。而且file_fdw是只读的,因为我知道,所以这也可以。

可能起作用的是:

create temporary table ... as
delete from ... returning *;

...然后copy临时表到文件。