(UPDATE:沒有必要對這一手,我問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)
ON_ERROR_ROLLBACK變量確實是我想要的:) – fmark 2010-05-01 06:20:03
'ON_ERROR_ROLLBACK'雖然看起來像psql客戶端的一個功能,但不是postgres自身(所以你不能從數據庫應用程序使用它,只能從命令行使用)。 – Glyph 2012-03-02 17:17:49
@Glyph:是的,這是psql的一項功能,它專門面向交互式使用 - 這是OP的場景。當期望的行爲有意義時,我很難想到應用場景。 – leonbloy 2012-03-02 18:27:41