【问题标题】:Ignore Postgresql batch insert errors忽略 Postgresql 批量插入错误
【发布时间】:2010-10-06 13:15:44
【问题描述】:

假设这个简单的 SQL 查询:

INSERT INTO table (col1,col2) VALUES (val1,val2),(val3,val4),(val5,val6);

假设val3col1 的无效值。这将导致 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


【解决方案1】:

处理输入文件的应用程序需要用保存点包装每个 INSERT 语句。如果插入失败,可以回滚到最后一个保存点。比如:

(伪代码)

前行 设置保存点 尝试 插入当前行 抓住 回滚到保存点 结尾 结束循环 犯罪

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2017-03-27
    • 1970-01-01
    • 2020-09-05
    • 2019-09-20
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多