【问题标题】:Know which index caused an error during a bulk INSERT or bulk UPDATE in PostgreSQL了解在 PostgreSQL 中的批量插入或批量更新期间哪个索引导致错误
【发布时间】:2022-01-10 16:56:07
【问题描述】:

当我在 PostgreSQL 中插入或更新一个行列表并且其中一个导致错误时,我如何才能确切地知道哪一个(它在输入列表中的索引)?

例如,如果我对 name 列有一个 UNIQUE 约束,并且如果名称 two 已经存在,我想知道约束违反是由索引 1 处的输入行引起的。

INSERT INTO table (id, name) VALUES ('0000', 'one'), ('0001', 'two');

我知道 PostgSQL 会在遇到第一个错误时停止,因此我们无法知道所有有问题的行。没关系,我只需要第一个有问题的索引(如果有的话)。

单独插入每一行是不可能的,因为我们也想优化性能。

【问题讨论】:

  • PostgreSQL 不打印任何可能涉及的行的主键——可能有零个或多个。如果你只是想有效地导入一批可能有重复或其他问题的行,你可能想问这个问题。
  • 我在这里假设您实际上对导致问题的约束名称并不感兴趣,因为如果您在 psql 中尝试此操作,PostgreSQL 会将其打印到您的屏幕上,并且可能您使用的任何客户端库都会为您提供如果您要求,也可以访问错误详细信息。
  • PostgreSQL 已经返回了被违反的约束名称。我想要的是输入列表中导致违规的行的索引(第一个索引,不是全部,如果有多个)

标签: postgresql error-handling


【解决方案1】:

Postgres 为您提供了您所要求的和实际的东西。它提供约束名称、列和值。但是,其中大部分是错误消息的后续细节。您需要提取完整的消息。见demo

【讨论】:

  • 看起来我们可以通过解析错误映射的“detail”字段中的字符串来获取导致违反约束的值。这更好,但仍然不完全是导致违反约束的输入行的索引
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多