我使用带有 PostGIS 扩展的 Postgresql 进行临时空间分析。我通常在 psql 中手动构建和发出 SQL 查询。我总是在事务中包装分析会话,所以如果我发出破坏性查询,我可以回滚它。
但是,当我发出包含错误的查询时,它会取消事务。任何进一步的查询都会引发以下警告:
错误:当前事务被中止,命令被忽略直到事务块结束
有没有办法可以关闭这种行为?每次我打错字时回滚事务并重新运行以前的查询是很烦人的。
我使用带有 PostGIS 扩展的 Postgresql 进行临时空间分析。我通常在 psql 中手动构建和发出 SQL 查询。我总是在事务中包装分析会话,所以如果我发出破坏性查询,我可以回滚它。
但是,当我发出包含错误的查询时,它会取消事务。任何进一步的查询都会引发以下警告:
错误:当前事务被中止,命令被忽略直到事务块结束
有没有办法可以关闭这种行为?每次我打错字时回滚事务并重新运行以前的查询是很烦人的。
(更新:不需要手动执行此操作,我在 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)
关闭它是不可能的,但是你可以使用不同的东西。有类似保存点的东西:
http://www.postgresql.org/docs/8.4/interactive/sql-savepoint.html
因此,您可以将事务回滚到某个较早的点,而无需将整个事务滚动为黑色。
不,没有办法关闭它。错误会为您隐式中止事务,因此您必须回滚并重试。