it-swarm.cn

最快检查PostgreSQL中是否存在行

我有一堆行需要插入到表中,但这些插入总是分批完成。所以我想检查表中是否存在批处理中的单行,因为我知道它们都已插入。

所以它不是主键检查,但不应该太重要。我想只检查单行,所以count(*)可能不好,所以它的类似exists我猜。

但是因为我对PostgreSQL相当新,所以我宁愿问那些知道的人。

我的批处理包含具有以下结构的行:

userid | rightid | remaining_count

因此,如果表包含任何提供userid的行,则表示它们都存在于那里。

129
Valentin Kuzub

使用EXISTS键Word为TRUE/FALSE返回:

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

怎么样简单:

select 1 from tbl where userid = 123 limit 1;

其中123是您要插入的批次的用户ID。

上述查询将返回空集或单行,具体取决于是否存在具有给定用户标识的记录。

如果结果太慢,你可以考虑在tbl.userid上创建一个索引。

如果在表中存在批处理中的单行,那么我不必插入我的行,因为我知道它们都已插入。

为了使这一点保持正确,即使您的程序在批处理中被中断,我建议您确保正确管理数据库事务(即整个批处理插入单个事务中)。

30
NPE
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
    ;

会做你想做的事:要么成功,要么失败。

9
wildplasser
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);
1
Royce

经验法则

select exists(从xx中选择true,其中xx)为“1 + 1加起来为2”;

0
CodeFarmer

如果您考虑性能,也许您可​​以在函数中使用“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;
0
francs
SELECT 1 FROM user_right where userid = ? LIMIT 1

如果结果集包含一行,则不必插入。否则插入您的记录。

0
Fabian Barney