【发布时间】:2020-09-24 17:33:51
【问题描述】:
我在 Postgres 中有一个表,其中包含一个用户 ID 列和一个外部 ID,这些列将用于对外部服务的 API 调用。我必须在我这边创建外部 id,验证它是唯一的,然后在调用外部 API 之前将其存储在 PG 中。 这篇文章接近我想要的: How can I generate a unique string per record in a table in Postgres? 但是,如果两个并发调用生成相同的 id,则可能会发生冲突。我想做的是有一个生成随机字符串的循环,然后尝试将带有用户 ID 的字符串插入表中。如果随机字符串已经存在(列上有唯一约束),它应该会失败。如果失败,它应该生成另一个 id 并尝试插入它(一旦我得到工作代码,我将添加一个计数器以防止敲击 db)。
您将如何编写该循环?如果 INSERT 返回错误(约束检查),则循环应继续,否则再次循环。我检查了 Postgres 文档,似乎找不到(或丢失)检查查询错误代码/状态的方法。
更新
我想出了一个可能的解决方案,但需要充实它。以下是pidgeon-sql,只是我在思考这个问题:
success = true;
LOOP
-- create random string function
BEGIN
insert string
EXCEPTION
success = false;
EXIT WHEN success;
END;
【问题讨论】:
-
UUID 扩展是否有效?
-
很遗憾外部 API 不使用 UUID
-
是的,但是:
select uuid_generate_v1mc()::varchar; 3c464166-fe95-11ea-87f2-0fd30065b715 select pg_typeof(uuid_generate_v1mc()::varchar); character varying -
@JEPrice:然后将 uuid 转换为字符串
-
它太长了。不知道为什么外部 api 开发人员会这样,但它最多 10 个字符:/
标签: postgresql function loops unique-constraint