(CẬP NHẬT:Không cần phải làm điều này bằng tay, tôi đã hỏi trong danh sách gửi thư postgresql và hóa ra là hành vi này đã được thực hiện, bởi bộ ON_ERROR_ROLLBACK trong máy khách psql)
Để giải thích rõ hơn về câu trả lời của Simon (+1), trong trường hợp của bạn, bạn có thể bắt đầu thêm một điểm lưu sau mỗi truy vấn tương tác, luôn có cùng tên (nó sẽ ghi tên trước đó nếu truy vấn thành công). Trong trường hợp xảy ra lỗi, bạn quay lại lần lưu cuối cùng và tiếp tục từ đó.
Một ví dụ về kiểu làm việc này:
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)