背景:这是针对 Ruby on Rails 网络应用程序的。我有一个后台工作,它从 Facebook 下载最近的帖子并将它们插入数据库。我正在使用手工编码的 SQL 来提高性能。 RDBMS 是 PostgreSQL(在 Heroku 上)。
该表称为“帖子”。我有一个关于 posts.uid
和 posts.contact_id
组合的唯一索引。在 SQL 中,我使用 WHERE 条件来过滤掉表中已经存在的 uid
-contact_id
组合,但即便如此,我还是收到以下错误:
ActiveRecord::RecordNotUnique:PGError:错误:重复键值违反唯一约束“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 条件不应该阻止这种情况发生吗?
最佳答案
您的选择查询返回重复的行。
关于sql - 这个 SQL 查询怎么可能将重复值插入到数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330803/