PostgreSQL -Продолжить при уникальном _нарушении (plpgsql)

У меня есть таблица PostgreSQL, в которой проиндексированы некоторые поля, и они должны быть уникальными, чтобы предотвратить дублирование. Это делается благодаря функции PLPGSQL, которая вставляет все поля и перехватывает уникальное исключение нарушения _, хотя прекращает вставлять записи, даже если есть только один дубликат.

Я не могу сделать несколько INSERT из-за проблем с производительностью (некоторые из них выполняются сотнями ), проблема в том, что он останавливает весь процесс, даже если есть только один дубликат, как в первых двух значениях в следующем пример.

CREATE OR REPLACE FUNCTION easy_import() RETURNS VOID AS
  $$
  BEGIN
    BEGIN
      INSERT INTO things ("title", "uniq1", "uniq2") VALUES
      ('title 1', 100, 102),
      ('title 2', 100, 102),
      ('title 3', 101, 102),
      ('title 4', 102, 102),
      ('title 5', 103, 102),
      ('title 6', 104, 102),
      ('title 7', 105, 102),
      ('title 8', 106, 102),
      ('title 9', 107, 102),
      ('title 10', 108, 102);
      RETURN;
    EXCEPTION WHEN unique_violation THEN
      -- do nothing
    END;
  END;
  $$
  LANGUAGE plpgsql;

Есть ли способ игнорировать уникальное нарушение _только для одной записи и предотвратить остановку дальнейших INSERT?

Спасибо.

Обновление

  • Уникальный индекс имеет его в полях «uniq1» и «uniq2», извините за путаницу.
  • Хотя решение @cdhowie кажется лучшим, оно каким-то образом игнорирует тот факт, что если вы запустите тот же запрос, он вызовет ошибку. Это странно, потому что запрос делает JOINне просто так. Все еще работаю над этим.
9
задан metrobalderas 26 July 2012 в 20:51
поделиться