理想情况下,9.1 中新的“WITH ROWS”功能应该支持跨数据库边界,但它似乎只能在单个数据库中工作。
WITH moved_rows AS (
DELETE FROM events
WHERE
"date" >= '2010-01-01' AND
"date" < '2011-01-01'
RETURNING *
)
INSERT INTO events_archive
SELECT * FROM moved_rows;
我希望我能够将事件指定为类似“DELETE FROM LiveDB.events”的内容,然后我可以执行“INSERT INTO ArchiveDB.events”。 dblink 似乎无法获取要移动的行列表,即使可以,我也不确定此语句在数据库中是否是事务安全的...
最佳答案
您可以将数据转储到文件(使用 SQL COPY 或 psql \copy )并在一个事务中将其删除,然后在另一个事务中将其导入另一个数据库。要在单个事务中执行这两个步骤,您需要 XA(分布式事务)。
从 LiveDB 转储
BEGIN TRANSACTION;
COPY (
SELECT * FROM events
WHERE "date" >= '2010-01-01'
AND "date" < '2011-01-01'
) TO '/tmp/events.csv' WITH CSV HEADER;
DELETE FROM events
WHERE "date" >= '2010-01-01'
AND "date" < '2011-01-01'
COMMIT;
插入 ArchiveDB:
COPY events FROM '/tmp/events.csv' WITH CSV HEADER;
希望对您有所帮助。
关于postgresql - 在 Postgresql 9.1 中将古代数据从一个数据库表归档到另一个数据库表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9336922/