Fastest check if row exists in PostgreSQL
我有一堆行需要插入到表中,但这些插入总是分批完成。 所以我想检查表中是否存在批处理中的单行,因为我知道它们都已插入。
所以它不是主键检查,但不应该太重要。 我想只检查单行,所以
但是因为我对PostgreSQL相当新,所以我宁愿问那些知道的人。
我的批处理包含具有以下结构的行:
1 | userid | rightid | remaining_count |
因此,如果表包含提供
使用EXISTS关键字返回TRUE / FALSE:
1 | SELECT EXISTS(SELECT 1 FROM contact WHERE id=12) |
怎么样简单:
1 | SELECT 1 FROM tbl WHERE userid = 123 LIMIT 1; |
其中
上述查询将返回空集或单行,具体取决于是否存在具有给定用户标识的记录。
如果结果太慢,您可以考虑在
if even a single row from batch exists in table, in that case I
don't have to insert my rows because I know for sure they all were
inserted.
为了使这一点保持正确,即使您的程序在批处理中被中断,我建议您确保正确管理数据库事务(即整个批处理插入单个事务中)。
1 2 3 4 5 6 7 8 9 | 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 ... ) ; |
顺便说一句:如果你希望整个批次在重复的情况下失败,那么(给定主键约束)
1 2 3 4 | INSERT INTO target( userid, rightid, COUNT ) SELECT userid, rightid, COUNT FROM batch ; |
会做你想做的事:要么成功,要么失败。
1 | SELECT TRUE FROM tablename WHERE condition LIMIT 1; |
我相信这是postgres用于检查外键的查询。
在你的情况下,你也可以一气呵成:
1 | INSERT INTO yourtable SELECT $userid, $rightid, $count WHERE NOT (SELECT TRUE FROM yourtable WHERE userid = $userid LIMIT 1); |
经验法则
select exists (
select true from xx where xx
) as"Does 1+1 adds up to 2";
如果你考虑性能,可能是你可以在函数中使用"PERFORM",如下所示:
1 2 3 4 5 6 | 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; |
1 | SELECT 1 FROM user_right WHERE userid = ? LIMIT 1 |
如果结果集包含一行,则不必插入。否则插入您的记录。