我在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
。
答案 0 :(得分:1)
The documentation没有提及TRUNCATE
远程表的能力。 (SELECT
,INSERT
,UPDATE
和DELETE
被列为可用命令。)作为解决方法,您可以使用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
。
我觉得上面的回答有点简短,所以我做了说明。