Игнорировать ошибки пакетной вставки Postgresql - PullRequest
2 голосов
/ 06 октября 2010

Предположим, что этот простой запрос 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+ значений не вставленными в таблицу, потому что одно из этих значений неверно.

1 Ответ

1 голос
/ 06 октября 2010

Приложение, которое обрабатывает входной файл, должно обернуть каждый оператор INSERT точкой сохранения.Если вставка не удалась, ее можно откатить до последней точки сохранения.Что-то вроде:

(псевдокод)

foreach line
  set savepoint
  try 
    insert current line
  catch 
    rollback to savepoint
  end
endloop
commit
...