(更新:これを手動で行う必要はありません。postgresqlメーリングリストで質問したところ、psqlクライアントで設定されたON_ERROR_ROLLBACKによって、この動作はすでに実装されていることがわかりました)
サイモンの答え(+1)を詳しく説明するために、シナリオでは、各対話型クエリの後に、常に同じ名前でセーブポイントを追加することができます(クエリが成功した場合は前の名前を上書きします)。エラーが発生した場合は、最後に保存したものに戻り、そこから続行します。
この作業パターンの例:
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)