捕获重复密钥异常并继续插入



我在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();

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

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

Microsoft。EntityFrameworkCore。DbUpdateException:发生错误同时更新条目。有关详细信息,请参阅内部异常。--->Npgsql。PostgresException:23505:重复的键值违反了unique约束"包裹号_userid_timestamputc_idx">

如何忽略它并继续插入?

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

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

  1. 创建一个存储过程,用于接收地块,并在具有唯一键约束的列上执行插入和联接(=过滤掉where条件中已具有值的所有对象(
  2. 从代码中调用存储过程并传递包裹

如果你需要一个人工id,有两种方法可以做到:

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

最新更新