微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用自动增量索引时避免插入重复项

如何解决使用自动增量索引时避免插入重复项

我有一个查询

INSERT INTO tweet_hashtags(hashtag_id,tweet_id)
VALUES(1,1) 
ON CONFLICT DO nothing 
RETURNING id

可以正常工作并插入id = 1,但是如果有重复项,则假设另一个(1,1)插入了id = 2。我想防止这种情况的发生,我读到我可以做ON CONFLICT (col_name),但这并没有真正的帮助,因为我需要一次检查两个值。

解决方法

on冲突子句在您要唯一的一组列上需要一个唯一约束或索引-好像您没有适当的约束或索引。

您可以在创建表格表格时对其进行设置:

create table tweet_hashtags(
    id serial primary key,hashtag_id int,tweet_id int,unique (hashtag_id,tweet_id)
);

或者,如果该表已经存在,则可以创建一个唯一索引(但是您需要首先消除重复项):

create unique index idx_tweet_hashtags on tweet_hashtags(hashtag_id,tweet_id);

然后您的查询应该可以正常工作:

insert into tweet_hashtags(hashtag_id,tweet_id)
values(1,1) 
on conflict (hashtag_id,tweet_id) do nothing 
returning id

指定冲突目标可以使意图更明确,并且通常应优先考虑(尽管在do nothing中不是强制性的)。

请注意,跳过插入操作(即不返回现有的id)时查询不返回任何内容。

这里是一个demo on DB Fiddle,用于演示使用和不使用唯一索引的行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。