自定义范围的增量SQL列
我有自定义范围的增量SQL列,sql,postgresql,Sql,Postgresql,我有用户表格和帖子表格。一个用户有很多帖子 创建表用户(id INT主键,名称VARCHAR(10)) 创建表post(id INT,user_id INT,text text,主键(id,user_id)) 我的问题是,如何创建一个自动递增机制来递增用户帖子的id,但只限于用户(用户id) 比如说, 用户1有2篇文章,第一篇文章有id1,第二篇文章有id2 用户2有3篇文章,第一篇文章有id1,第二篇文章有id2,第三篇文章有id3 posts表的行如下所示 从帖子中选择*; 用户id文本
用户
表格和帖子
表格。一个用户有很多帖子
创建表用户(id INT主键,名称VARCHAR(10))代码>
创建表post(id INT,user_id INT,text text,主键(id,user_id))代码>
我的问题是,如何创建一个自动递增机制来递增用户帖子的id
,但只限于用户(用户id
)
比如说,
用户1
有2篇文章,第一篇文章有id1
,第二篇文章有id2
用户2
有3篇文章,第一篇文章有id1
,第二篇文章有id2
,第三篇文章有id3
posts
表的行如下所示
从帖子中选择*;
用户id文本
1 1“从用户1发布一个”
2 1“从用户2发布一个”
2“从用户2发布2”
2 3“从用户2发布三个”
1 2“从用户1发布两个”
我知道这可以通过两次访问数据库在应用程序级别实现,例如查询特定用户的最后一个帖子id并基于该id创建帖子。但这可能会在多用户环境中引入冲突。我可能无法正确理解您的问题,但在插入时,您可以通过在插入中使用子查询非常轻松地增加帖子的id
INSERT INTO posts (user_id, id, text) VALUES
(userIdVar, (SELECT max(id) + 1 FROM posts WHERE user_id = userIdVar), postText);
非常感谢。我想这应该管用!我不知道这是可能的。我是否需要将其打包到事务中?或者这些已经是原子的了?现在还没有解决,因为我认为这个查询不是原子的。如果两个进程同时访问post行,这将创建竞争条件。一个用户怎么可能同时发布两条消息?如果您关心种族,您可以使用设置事务隔离级别SERIALIZABLE
虽然这会使您的事务更昂贵。@ChristianSakai也从用户\u id=userIdVar
看不到未限制事务的帖子中选择max(id)+1,这样您就有可能得到相同的id号。。iam不确定是否将事务隔离级别设置为可序列化
是否会修复此问题。@b可能会有多个管理员尝试像用户一样执行相同的操作(即创建、编辑、删除等)。很抱歉,我最初的问题陈述中不清楚。