繁体   English   中英

这个SQL查询如何将重复的值插入数据库?

[英]How can this SQL query possibly INSERT duplicate values into the database?

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

该表称为“帖子”。 我对posts.uidposts.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条件是否应该阻止这种情况的发生?

您的选择查询返回重复的行。

检查空值。

我假设唯一索引"index_posts_on_uid_and_contact_id"不是PK,因此它将接受空值。 如果其中一个字段

SELECT * FROM posts 
           WHERE posts.uid = t.uid 
           AND posts.contact_id = contacts.id

查询为null,则存在将返回false,并且可能会插入重复的数据。

另外,我会select 1而不是select * 我觉得更好

我会做

WHERE (contacts.fb_id = t.fb_id) and (t.uid is not null) and  (contacts.id is not null)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM