database - 我可以要求 Postgresql 忽略事务中的错误吗

标签 database postgresql postgis

我将 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/

相关文章:

database - DynamoDB 查找最近的整数键

c# - 当我使用带参数的 Insert Into 语句时出现 fatal error

mysql - 使用 shell 脚本将多个表复制到 postgres 数据库

python - SQLAlchemy 和反射表中的外键

java - 对 Hibernate 数据库结构进行逆向工程

c# - 在 Entity Framework Code First (DbContext) 上使用不同的数据库进行调试和发布

postgresql - 组织.postgresql.util.PSQLException : FATAL: password authentication failed for user "postgres"

java - 如何将 HEXEWKB 转换为纬度、经度(在 Java 中)?

java - 无法使用 spring 和 hibernate 5.0 执行空间查询

postgresql - 将两个数据字段插入到具有相同投影的 PostGis 中的单个数据字段中