Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义范围的增量SQL列_Sql_Postgresql - Fatal编程技术网

自定义范围的增量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篇文章,第一篇文章有id
1
,第二篇文章有id
2

用户
2
有3篇文章,第一篇文章有id
1
,第二篇文章有id
2
,第三篇文章有id
3

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可能会有多个管理员尝试像用户一样执行相同的操作(即创建、编辑、删除等)。很抱歉,我最初的问题陈述中不清楚。