在我的桌子上,我有一个标记为 md5 的辅助唯一键。插入之前,我先检查一下MD5是否存在,如果没有,就插入,如下图:
-- Attempt to find this item
SELECT INTO oResults (SELECT domain_id FROM db.domains WHERE "md5"=oMD5);
IF (oResults IS NULL) THEN
-- Attempt to find this domain
INSERT INTO db.domains ("md5", "domain", "inserted")
VALUES (oMD5, oDomain, now());
RETURN currval('db.domains_seq');
END IF;
这对于单线程插入非常有用,我的问题是当我有两个外部应用程序同时调用我的函数时恰好具有相同的 MD5。我最终遇到的情况是:
应用程序 1:看到 MD5 不存在
应用 2:将此 MD5 插入表中
应用程序 1:现在将 MD5 插入到表中,因为它认为它不存在,但由于在它看到它不存在后立即出现错误,应用程序 2 插入了它。
有没有更有效的方法来做到这一点?
我可以在插入时捕捉到错误吗?如果可以,然后选择 domain_id?
提前致谢!
这似乎也包含在插入中,在 PostgreSQL 中重复更新?