sql - 这个 SQL 查询怎么可能将重复值插入到数据库中?

标签 sql ruby-on-rails ruby postgresql indexing

背景:这是针对 Ruby on Rails 网络应用程序的。我有一个后台工作,它从 Facebook 下载最近的帖子并将它们插入数据库。我正在使用手工编码的 SQL 来提高性能。 RDBMS 是 PostgreSQL(在 Heroku 上)。

该表称为“帖子”。我有一个关于 posts.uidposts.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/

相关文章:

ruby - 如何定义新的循环函数

c# - 从数据库中检索主键

SQL Server/Oracle : Private temporary tables

mysql - SQL - 结果由多行组成

html - 防止语言环境文件中的 HTML 字符实体被 Rails3 xss 保护破坏

javascript - rails : Javascript for tracking sessions firing inconsistently

ruby-eventmachine 将 start_server 与实例一起使用

ruby - 在 block 内使用yield时出现错误 no block

Azure ML 上的 SQL 更新不起作用?

ruby-on-rails - 使用 button_to 更新多个值 - Rails 4