【发布时间】:2010-10-06 13:15:44
【问题描述】:
假设这个简单的 SQL 查询:
INSERT INTO table (col1,col2) VALUES (val1,val2),(val3,val4),(val5,val6);
假设val3 是col1 的无效值。这将导致 psql 中止整个 INSERT 命令 - 它不会插入 (val1,val2) 或 (val5,val6)。
是否可以让 postgresql 忽略此错误,因此它不会插入 (val3,val4) 对,但仍会继续处理 (val1,val2) 和 (val5,val6)?
我每天从我的合作伙伴那里获得文本文件中的数据库转储(无法更改),我用它来制作它的副本。有时他巨大的 INSERT 查询会导致如下错误:
ERROR: invalid byte sequence for encoding "UTF8": 0x00
... 这使得整个 30000+ 值没有插入到表中,因为其中一个值是错误的。
【问题讨论】:
-
顺便说一句。我想出的一种解决方案是解析该文本文件并将所有批处理 INSERT 命令更改为多个单值命令。但在我实施之前 - 也许你们想出了更好的解决方案。
-
使用 COPY 语句而不是大插入语句可能会更好。
-
另外,这些文件是如何准备的? 为什么里面有非法的字节序列?
-
@Pointy:我不知道为什么。这些是由其他公司从他们的数据库中准备的(我猜是 MySQL)。我不能强迫他们改变转储格式。
-
那么最好的办法是编写一些简单的过滤器将“INSERT”语法转换为 CSV 文件,并过滤掉虚假的 UTF-8 序列。然后你就可以使用 COPY FROM 了,反正比一堆 INSERT 语句要快很多。
标签: sql postgresql insert batch-insert