我将 Postgresql 与 PostGIS 扩展一起用于临时空间分析。我通常在 psql 中手动构造和发出 SQL 查询。我总是将分析 session 包装在事务中,因此如果我发出破坏性查询,我可以将其回滚。
但是,当我发出包含错误的查询时,它会取消交易。任何进一步的查询都会引发以下警告:
ERROR: current transaction is aborted, commands ignored until end of transaction block
有什么方法可以关闭此行为?每次打错字都要回滚事务并重新运行以前的查询,这很烦人。
最佳答案
(更新:无需手动执行此操作,我在 postgresql 邮件列表中询问过,结果表明此行为已通过 psql 客户端中的 ON_ERROR_ROLLBACK 设置实现)
为了详细说明 Simon 的回答 (+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)
关于database - 我可以要求 Postgresql 忽略事务中的错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2741919/