在外表上截断

时间:2014-07-14 19:04:18

标签: postgresql

我在postgresql 9.3.3上使用postgresql_fdw。

这就是我所拥有的:

SERVER_A:

SERVER_A=> CREATE TABLE table_a (
SERVER_A(>   id integer,
SERVER_A(>   val varchar(10)
SERVER_A(> );
SERVER_A=> INSERT INTO table_a VALUES (1, "a");
INSERT 0 1

SERVER_ACTIVE:

SERVER_ACTIVE=> CREATE FOREIGN TABLE table_a (
SERVER_ACTIVE(>  id integer,
SERVER_ACTIVE(>  val varchar(10)
SERVER_ACTIVE(> ) SERVER SERVER_A;
CREATE FOREIGN TABLE

现在我检查元素。

SERVER_ACTIVE=> SELECT COUNT(*) FROM table_a;
 count
-------
     1
(1 row)

现在我要截断表:

ACC_ACTIVE=> TRUNCATE TABLE table_a;
ERROR:  "table_a" is not a table
ACC_ACTIVE=> TRUNCATE FOREIGN TABLE table_a;
ERROR:  syntax error at or near "FOREIGN"
LINE 1: TRUNCATE FOREIGN TABLE table_a;

为什么不起作用?我如何使其工作?这个表应该包含数百万条记录,我不能使用DELETE。但即使我DELETE,我也无法使用VACUUM

2 个答案:

答案 0 :(得分:1)

The documentation没有提及TRUNCATE远程表的能力。 (SELECTINSERTUPDATEDELETE被列为可用命令。)作为解决方法,您可以使用dblink

答案 1 :(得分:0)

文档非常清晰https://www.postgresql.org/docs/current/postgres-fdw.html。它说:

现在,您只需要从外部表进行SELECT即可访问存储在其基础远程表中的数据。您还可以使用INSERT,UPDATE或DELETE修改远程表。 (当然,您在用户映射中指定的远程用户必须具有执行这些操作的权限。)

简而言之,postgres_fwd在远程(外部)表上不支持TRUNCATE

您可以使用DELETE FROM table;删除表中的所有行。在从远程(外部)表中删除数据的上下文中,它将重新创建TRUNCATE TABLE table

我觉得上面的回答有点简短,所以我做了说明。