我正试图在我的项目中实现数据库抽象,但现在我在PostgreSQL中做了批量INSERT。我的项目是在C#中,我使用PostgreSQL 9.3和npgsql.dll 2.0.14。如何在没有主键冲突的情况下执行PostgreSQL Bulk INSERT
对于Microsoft SQL Server,我通过连接所有语句,然后执行的ExecuteNonQuery简单地做批量插入:通过选择 -
IF NOT EXISTS (SELECT id FROM table WHERE id = 1) INSERT INTO table (id) VALUES (1);
IF NOT EXISTS (SELECT id FROM table WHERE id = 2) INSERT INTO table (id) VALUES (2);
IF NOT EXISTS (SELECT id FROM table WHERE id = 3) INSERT INTO table (id) VALUES (3);
尽管IF-NOT-EXISTS子句可以在PostgreSQL的取代在那里,这种方法遗憾的仍然不起作用 - 因为PostgreSQL中的每一条语句都是单独提交的。
因此,我搜索了另一个解决方案,并发现使用COPY
命令和NpgsqlCopySerializer/NpgsqlCopyIn一起正常地“流”批量数据的方法。但是现在我总是得到主键违例错误 - 因为EXISTS/WHERE子句似乎不能与COPY
语句一起使用。
我真的很想避免一个一个地插入INSERT,因为这会极大地减慢我的应用程序,所以我希望任何人都能解决这个问题!
嗨yieldfalsehood,你让我的一天!实际上BEGIN-COMMIT是我错过了使我的代码工作(与SELECT-WHERE-NOT-EXISTS一起) – Loonis