如何解决使用自动增量索引时避免插入重复项
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 举报,一经查实,本站将立刻删除。