(UPPDATERING:Inget behov av att göra detta för hand, jag frågade i postgresqls e-postlistor, och det visade sig att detta beteende redan är implementerat, av ON_ERROR_ROLLBACK inställd i psql-klienten)
För att utveckla Simons svar (+1) , i ditt scenario kan du rutinärt lägga till en räddningspunkt efter varje interaktiv fråga, alltid med samma namn (den skriver över den föregående om frågan är framgångsrik). Vid fel går du tillbaka till den senast sparade och fortsätter därifrån.
Ett exempel på detta arbetsmönster:
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)