最快检查行是否存在于PostgreSQL中

t30tvxxf  于 5个月前  发布在  PostgreSQL
关注(0)|答案(7)|浏览(53)

我有一堆行需要插入到表中,但是这些插入总是成批完成的。所以我想检查一下是否有一行来自该批,因为这样我就知道它们都被插入了。
所以这不是一个主键检查,但应该不会太重要。我想只检查单行,所以count(*)可能是不好的,所以它的东西像exists我猜。
但由于我对PostgreSQL相当陌生,我宁愿问那些知道的人。
我的批处理包含具有以下结构的行:

userid | rightid | remaining_count

字符串
因此,如果表中包含任何提供了userid的行,则意味着它们都存在。

wpx232ag

wpx232ag1#

使用EXISTS关键字返回TRUE /TRUE:

SELECT EXISTS(SELECT 1 FROM contact WHERE id=12)

字符串

jhkqcmku

jhkqcmku2#

简单地说:

select 1 from tbl where userid = 123 limit 1;

字符串
其中123是要插入的批处理的用户ID。
上面的查询将返回空集或单行,这取决于是否存在具有给定userid的记录。
如果这被证明太慢,你可以考虑在tbl.userid上创建一个索引。
即使只有一行批处理数据存在于表中,在这种情况下,我也不必插入行,因为我确信它们都已插入。
为了保持这一点,即使你的程序在批处理中被中断,我建议你确保你正确地管理数据库事务(即整个批处理被插入到一个事务中)。

kmbjn2e3

kmbjn2e33#

INSERT INTO target( userid, rightid, count )
  SELECT userid, rightid, count 
  FROM batch
  WHERE NOT EXISTS (
    SELECT * FROM target t2, batch b2
    WHERE t2.userid = b2.userid
    -- ... other keyfields ...
    )       
    ;

字符串
顺便说一句:如果您希望整个批处理在重复的情况下失败,那么(给定主键约束)

INSERT INTO target( userid, rightid, count )
SELECT userid, rightid, count 
FROM batch
    ;


会完全按照你的意愿去做:要么成功,要么失败。

ni65a41a

ni65a41a4#

select true from tablename where condition limit 1;

字符串
我相信这是postgres用来检查外键的查询。
在你的情况下,你也可以一次性完成:

insert into yourtable select $userid, $rightid, $count where not (select true from yourtable where userid = $userid limit 1);

j2datikz

j2datikz5#

如果你考虑性能,也许你可以在一个函数中使用“PERFORM”,就像这样:

PERFORM 1 FROM skytf.test_2 WHERE id=i LIMIT 1;
  IF FOUND THEN
      RAISE NOTICE ' found record id=%', i;  
  ELSE
      RAISE NOTICE ' not found record id=%', i;  
 END IF;

字符串

ioekq8ef

ioekq8ef6#

SELECT 1 FROM user_right where userid = ? LIMIT 1

字符串
如果你的结果集包含一行,那么你不必插入。否则插入你的记录。

dz6r00yl

dz6r00yl7#

@MikeM指出。

select exists(select 1 from contact where id=12)

字符串
在联系人上使用index,通常可以将时间成本降低到1 ms。

CREATE INDEX index_contact on contact(id);

相关问题