(ACTUALIZACIÓN:no es necesario hacerlo a mano, pregunté en las listas de correo de postgresql y resultó que este comportamiento ya está implementado por el conjunto ON_ERROR_ROLLBACK en el cliente psql)
Para profundizar en la respuesta de Simon (+1), en su escenario podría agregar rutinariamente un punto de guardado después de cada consulta interactiva, siempre con el mismo nombre (sobrescribe el anterior si la consulta es exitosa). En caso de error, vuelve al último guardado y continúa desde allí.
Un ejemplo de este patrón de trabajo:
db=# select * from test_gral ;
i | t | n
---+------+------
1 | text | 10.0
(1 row)
db=# begin;
BEGIN
db=# insert into test_gral values (2,'xx',20); savepoint sp;
INSERT 0 1
SAVEPOINT
db=# insert into test_gral values (3,'xx',30); savepoint sp;
INSERT 0 1
SAVEPOINT
db=# insert into test_gralxx values (4,'xx',40); savepoint sp;
ERROR: relation "test_gralxx" does not exist
LINE 1: insert into test_gralxx values (4,'xx',40);
^
ERROR: current transaction is aborted, commands ignored until end of transaction block
db=# ROLLBACK TO SAVEPOINT sp;
ROLLBACK
db=# insert into test_gral values (4,'xx',40); savepoint sp;
INSERT 0 1
SAVEPOINT
db=# commit;
COMMIT
db=# select * from test_gral ;
i | t | n
---+------+------
1 | text | 10.0
2 | xx | 20
3 | xx | 30
4 | xx | 40
(4 rows)