我在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">
如何忽略它并继续插入?
我发现了一些类似的问题,比如这个和这个,但我不想把表加载到内存中,因为有很多记录要比较
您应该能够做到以下几点:
- 创建一个存储过程,用于接收地块,并在具有唯一键约束的列上执行插入和联接(=过滤掉
where
条件中已具有值的所有对象( - 从代码中调用存储过程并传递包裹
如果你需要一个人工id,有两种方法可以做到:
- 从插入函数(
returning id
(返回数据库自动为您创建的ID - 在客户端上生成Id(通常只有在具有GUID列时才能正常工作(