Для всех версий PostgreSQL вы можете создать триггерную функцию для удаления строк из таблицы и вставки их в другую таблицу. Но это кажется медленнее, чем массовая вставка, выпущенная в PostgreSQL 9.1. Вам просто нужно переместить старые данные в другую таблицу, прежде чем они будут удалены. Это делается с типом данных OLD:
CREATE FUNCTION moveDeleted() RETURNS trigger AS $$
BEGIN
INSERT INTO another_table VALUES(OLD.column1, OLD.column2,...);
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER moveDeleted
BEFORE DELETE ON table
FOR EACH ROW
EXECUTE PROCEDURE moveDeleted();
Как и в предыдущем ответе, после PostgreSQL 9.1 вы можете сделать это:
WITH tmp AS (DELETE FROM table RETURNING column1, column2, ...)
INSERT INTO another_table (column1, column2, ...) SELECT * FROM tmp;