当前位置: 首页 > 知识库问答 >
问题:

捕获重复的键异常并继续插入

凌嘉志
2023-03-14

我在PostgreSQL中有一个表,它有许多记录和唯一的键

CREATE TABLE parcels
(
    Id SERIAL PRIMARY KEY NOT NULL,
    Number CITEXT NOT NULL,
    UserId INT REFERENCES Stations(Id) NOT NULL,
    TimeStampUtc TIMESTAMP WITHOUT TIME ZONE NOT NULL
);
CREATE UNIQUE INDEX ON parcels (Number, UserId, (TimeStampUtc::date));

然后我从Excel导入数据并将其映射到列表。最后,我有一些像

 await _dbContext.Parcels.AddRangeAsync(parcels);
 await _dbContext.SaveChangesAsync();

包裹包含大约20,000条记录,并且可以包含违反唯一约束的记录。在这种情况下,我需要跳过该记录并继续插入。

现在我得到了一个预期的错误

微软EntityFrameworkCore。DbUpdateException:更新条目时出错。有关详细信息,请参见内部异常---

如何忽略它并继续插入?

我发现一些类似的问题像这个和这个但我不想加载表到内存因为有很多记录比较

共有1个答案

呼延衡
2023-03-14

您应该能够做到以下几点:

  1. 创建一个存储过程,用于接收地块,并在具有唯一键约束(=过滤掉所有已在其中条件中具有值的项)的列上执行与连接成对的插入操作。

如果您需要人工id,有两种方法:

  • 从插入函数返回数据库自动为您创建的ID(返回ID
  • 在客户机上生成Id(通常只有在具有GUID列时才能正常工作)

 类似资料:
  • 问题内容: 发生异常后,我可以返回执行try块吗?(目标是写得更少)例如: 与 问题答案: 不,你不能那样做。这就是Python具有其语法的方式。一旦由于异常而退出try块,就无法返回。 那for循环呢? 但是请注意,裸露裸露是不明智的做法。您应该改为捕获特定的异常。我之所以这么做,是因为在不知道方法可能会抛出什么异常的情况下,这是我所能做的。

  • 问题内容: 我有一个带有唯一主键列的表。有时,当我执行查询时会收到错误消息,因为该值已被使用。 我可以使用和捕获此特定错误吗? 问题答案: 看起来mysql为重复的主键抛出了1062错误代码。您可以检查sql异常的错误代码: 注意,这种方法不是跨数据库供应商的,因为不同的供应商对于重复的PK可能具有不同的错误代码。

  • 问题内容: 是否可以捕获异常并继续执行脚本? 问题答案: 当然,只要在要继续执行的地方捕获异常即可。 当然,这存在静默删除可能是非常重要的错误的问题。SomeOperation()可能会失败,从而导致其他难以解决的细微问题,但您永远不会知道是否静默删除该异常。

  • 问题内容: 我如何捕获此异常: 问题答案: 我用弹簧,所以我们通过 但是就像@KevinGuancheDarias提到的那样: 请注意,虽然这可行。 我建议通过在save之前发出findBy来解决该问题 ,因为这很麻烦,我认为不保证它将在将来的版本中使用,甚至可能在没有通知的情况下中断。

  • 如何捕获此异常:

  • 无法在中包装流对象。 我试过这样: Eclipse开始抱怨在下划线,并建议它需要用try/catch包围