[英]How can this SQL query possibly INSERT duplicate values into the database?
背景:这是针对Ruby on Rails Web应用程序的。 我有一个后台工作,可以从Facebook下载最新帖子,并将其插入数据库。 我正在使用手工编码的SQL来提高性能。 RDBMS是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条件是否应该阻止这种情况的发生?
您的选择查询返回重复的行。
检查空值。
我假设唯一索引"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.