背景:這是一個Ruby on Rails web應用程序。我有一個後臺工作,從Facebook下載最近的帖子並將其插入到數據庫中。我使用手動編碼的SQL來提高性能。 RDBMS是PostgreSQL(在Heroku上)。此SQL查詢如何可能將重複值插入到數據庫中?
該表被稱爲「帖子」。我對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條件不應該防止這種情況發生嗎?
如果您只是運行select子句中的所有內容,您的數據是什麼樣的?那是返回重複數據嗎? – 2012-02-17 15:23:00
這將需要不到2分鐘的時間來測試,因爲您已經擁有數據庫並且查詢已準備就緒。你真的在問什麼?你測試過了嗎?它不工作嗎? – kba 2012-02-17 15:23:50
Doug R和BD,很好的建議。我會嘗試。 KristianAntonsen,我不確定你是否閱讀了整個問題,但是,我已經測試過了,並且我得到了「違反了唯一約束」的錯誤。我看不出有可能發生這種情況(但其他兩位評論者可能已經指出了這一點)。 – 2012-02-17 15:31:18