postgresql 错误:当前事务已中止,忽略命令直到事务块结束

kd3sttzy  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(291)

我正在尝试使用表列约束来测试重复值的事务的执行:
首次运行:

BEGIN TRANSACTION;

  INSERT INTO table()...;

COMMIT;

result:
ERROR:  duplicate key value violates unique constraint "uk_22de7s2pr0nc0c713fd38lgei"
DETAIL:  Key (bin)=(111103) already exists.
SQL state: 23505

第二次运行:

ERROR:  current transaction is aborted, commands ignored until end of transaction block
SQL state: 25P02

我在pgadmin中总是得到同样的错误。
你知道我怎样才能正确地回滚或从第一次捕获异常吗?

whitzsjs

whitzsjs1#

如果出现重复的键值,您希望执行以下操作:忽略冲突、更新现有行或报告异常。要忽略错误,请将ON CONFLICT DO NOTHINGINSERT一起使用。同样,要更新现有行,请使用ON CONFLICT DO UPDATE ...。如果要在终止事务后报告异常,请将代码 Package 在plpgsql块中:

DO
LANGUAGE plpgsql
$BLOCK$
BEGIN
  INSERT INTO ...
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    RAISE;
END
$BLOCK$;

注意:对于单个语句,不需要使用START TRANSACTIONCOMMIT。当不在plpgsql块、过程或函数中时,每个语句都隐式地是单个事务。如果不使用START TRANSACTION,则仍然会报告异常,但事务将自动终止。

相关问题