Val*_*zub 150 sql postgresql
我有一堆行需要插入到表中,但这些插入总是分批完成.所以我想检查表中是否存在批处理中的单行,因为我知道它们都已插入.
所以它不是主键检查,但不应该太重要.我想只检查单行,所以count(*)可能不好,所以它就像exists我猜的那样.
但是因为我对PostgreSQL相当新,所以我宁愿问那些知道的人.
我的批处理包含具有以下结构的行:
userid | rightid | remaining_count
Run Code Online (Sandbox Code Playgroud)
因此,如果表包含任何提供的行,userid则意味着它们都存在于那里.
Mik*_*keM 280
使用EXISTS关键字返回TRUE/FALSE:
select exists(select 1 from contact where id=12)
Run Code Online (Sandbox Code Playgroud)
NPE*_*NPE 33
怎么样简单:
select 1 from tbl where userid = 123 limit 1;
Run Code Online (Sandbox Code Playgroud)
123您要插入的批次的用户标识在哪里.
上述查询将返回空集或单行,具体取决于是否存在具有给定用户标识的记录.
如果结果太慢,你可以考虑创建一个索引tbl.userid.
如果在表中存在批处理中的单行,那么我不必插入我的行,因为我知道它们都已插入.
为了使这一点保持正确,即使您的程序在批处理中被中断,我建议您确保正确管理数据库事务(即整个批处理在单个事务中插入).
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 ...
)
;
Run Code Online (Sandbox Code Playgroud)
顺便说一句:如果你希望整个批次在重复的情况下失败,那么(给定主键约束)
INSERT INTO target( userid, rightid, count )
SELECT userid, rightid, count
FROM batch
;
Run Code Online (Sandbox Code Playgroud)
会做你想做的事:要么成功,要么失败.
select true from tablename where condition limit 1;
Run Code Online (Sandbox Code Playgroud)
我相信这是 postgres 用于检查外键的查询。
对于您的情况,您也可以一次性执行此操作:
insert into yourtable select $userid, $rightid, $count where not (select true from yourtable where userid = $userid limit 1);
Run Code Online (Sandbox Code Playgroud)
如果您考虑性能,也许您可以在函数中使用“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;
Run Code Online (Sandbox Code Playgroud)