SQL Server 如何在Postgresql中为每个用户创建连续ID

z5btuh9x  于 2022-11-21  发布在  PostgreSQL
关注(0)|答案(3)|浏览(239)

我正在尝试在postgresql中创建一个表来保存用户的工作项。每个工作项在系统中都有一个唯一的ID,但是对于特定的用户也会有一个友好的序列ID。
到目前为止,我一直在使用:

CREATE TABLE WorkItems
(
  Id SERIAL NOT NULL PRIMARY KEY,
  ...
);

但我不知道如何划分每个用户的序列,也不知道如何对序列进行划分。
我希望用户能看到连续的Friendly Id

User1: ids = 1, 2, 3 etc..
User2: ids = 1, 2, 3, 4, 5 etc..

并且不必处理唯一ID,但是那些项目将具有从1-8的唯一ID。
我找了很多,都找不到任何关于这个主题的帖子,也许只是很难指定和搜索?
我是否应该将LastWorkIdUsed存储在用户列中,然后手动为他们的项创建一个友好的ID?看起来我不必担心并发和事务。有没有一种简单的方法可以在生成数字时将每个用户的LastWorkIdUsed传递给Postgresql?
或者,是否有办法将序列分配给用户?
也许我的基本设计思想是错误的,在SQLServer或MySQL中如何实现呢?

vc9ivgsu

vc9ivgsu1#

您说您 * 也 * 有一个全局唯一键。您可以使用它来解决并发问题。如果您允许用户工作项编号为空,则可以首先创建工作项,然后执行类似下面的操作为其分配一个“友好”编号。(T-SQL方言,@workItemID是全局唯一ID):

Update wi
set friendlyNumber = coalesce(
    (select max(friendlyNumber)+1 from WorkItem wi2 
     where wi2.userID = wi.userID and not wi2.friendlyNumber is null)
, 1)
From WorkItem wi
where workItemID = @workItemID and friendlyNumber is null

然后这样找出数字:

select friendlyNumber from WorkItem where workItemID = @workItemID
vx6bjr1n

vx6bjr1n2#

在 表 中 自动 生成 ID 的 最 常见 方法 是 使用 序列 , 如果 序列 用于 int/bigint 列 , 那么 我 认为 没有 理由 不 对 用户 友好 。
下面 是 Postgresql 13.6 的 演示 , 假定 postgres 是 表 和 序列 所属 的 用户 :

  • 定义 要 使用 的 序列 。
CREATE SEQUENCE user_id_seq;
ALTER SEQUENCE user_id_seq OWNER TO chopshop;

中 的 每 一 个

  • 测试 序列
-- This should return 1
SELECT nextval('user_id_seq'::regclass);

格式

  • 将 其 用作 表/关系 的 默认 值 。
CREATE TABLE user (
  user_id bigint not null primary key default nextval('user_id_seq'::regclass)
  ..
  ..
);

格式

  • 在 某些 Postgresql 版本 中 , 您 可能 需要 将 nextval('user_id_seq'::regclass) 修改 为 nextval('public.user_id_seq'::regclass) ( 也 称为 前置 模式 名称 ) 。
    • 是否 可以 为 用户/条目 分配 序列 ? * *
  • 您 可以 使用 触发 器 并 在 插入 之前 重新 校准 序列 , 但 请 不要 这样 做 。
  • 这 是 一 个 反 模式
  • 使用 reference_number 列 , 它 将 从 您 的 后端 代码 ( Spring , Django , FastAPI , Node 等 ) 中 计算 出来 , 它 将 遵循 每个 用户 的 模式 。
mnemlml8

mnemlml83#

我 觉得 这 是 一 个 " 我要 月亮 " 的 要求 。
如果 您 能 解释 一下 为什么 需要 这种 ID , 那么 在 为 您 寻找 解决 方案 时 , 它 将 与 我们 更 相关 。
在 我 看来 , 你 似乎 想要 一 个 用户 工作 的 线索 。

      • 我 的 解决 方案 : * * * 有 没有 可能 是 您 犯 了 一 个 设计 错误 ?
  • 工作 项 ( id _ workitem )
  • 用户 ( id _ user )
  • commit ( 用户 标识 , 工作 项 标识 , 提交 时间 , 注解 )

因此 , 现在 您 只需 连接 这些 表 并 按 committed _ on 排序 , 并 将 编号 ( 或 不 编号 ) 留给 您 的 应用 程序 。

相关问题