Справочная информация: это для веб-приложения Ruby on Rails. У меня есть фоновая работа, которая загружает последние сообщения из Facebook и вставляет их в базу данных. Я использую ручной код SQL для производительности. СУБД - это PostgreSQL (на Heroku).
Таблица называется "сообщения". У меня есть уникальный индекс по комбинации posts.uid
и posts.contact_id
. В SQL я использую условие WHERE для фильтрации uid
- contact_id
комбинаций, которые уже есть в таблице, но даже в этом случае я получаю следующую ошибку:
ActiveRecord::RecordNotUnique: PGError: ERROR: duplicate key value violates unique constraint "index_posts_on_uid_and_contact_id"
Без лишних слов, вот (динамический) SQL:
INSERT INTO posts
(message,contact_id,date,uid,created_at,updated_at,source,is_event)
SELECT
t.msg,
contacts.id,
t.date,
t.uid,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP,'facebook',
FALSE
FROM contacts,
(VALUES #{posts.map { |post| "(E'#{post['message'].escape_singles}','#
{post['uid']}',DATE '#{format_date(post['time'])}',#{post['status_id']})" }.join(", ")}) AS
t (msg,fb_id,date,uid)
WHERE contacts.fb_id = t.fb_id
AND (NOT EXISTS (
SELECT * FROM posts
WHERE posts.uid = t.uid
AND posts.contact_id = contacts.id));
Разве условие NOT EXISTS не должно препятствовать этому?