将PostgreSQL行号添加到一列

将PostgreSQL行号添加到一列,sql,postgresql,Sql,Postgresql,我有一个PostgreSQL数据库,包含以下列:名称、摘要等 我试图在“名称”列的每一行末尾添加一个行号 例如,我在“names”列的第一行有一个名称Christian,我希望它也能得到这样的行号:Christian-1 我使用以下命令插入到表中: INSERT INTO people(name, summary) VALUES ('Christian', 'some summary') ON CONFLICT ON CONSTRAINT unique_names DO NOTHING; 我应

我有一个PostgreSQL数据库,包含以下列:名称、摘要等

我试图在“名称”列的每一行末尾添加一个行号

例如,我在“names”列的第一行有一个名称Christian,我希望它也能得到这样的行号:Christian-1

我使用以下命令插入到表中:

INSERT INTO people(name, summary)
VALUES ('Christian', 'some summary')
ON CONFLICT ON CONSTRAINT unique_names DO NOTHING;
我应该在这个insert命令中添加什么来同时包含每行的编号


提前感谢您提供的任何帮助。

您可以创建一个名称编号序列,我们称之为“seq_num”

然后在插入时可以使用它

INSERT INTO people(name, summary)
VALUES ('Christian'||nextval('seq_num')::text, 'some summary');

不要将此数据直接放入表中。这会污染数据,还有其他方法可以通过附加id获得您的姓名

相反,创建如下视图:

创建或替换查看人员作为
选择*,name | |'-'| | id::text AS name|u with|u id
来自人民;

无论您在哪里需要带有附加id的
名称
,您现在都可以查询此视图而不是表,并且只需使用带有id的列
名称_

,如果我理解正确,您可以通过为每个名称附加一个特定的数字来避免重复名称<代码>关于冲突没有帮助,因为它会在发生冲突时更新行

您可以通过修复执行插入的查询来实现这一点。如果名称从未被删除或更新,以下逻辑将起作用:

insert into t (name)
    select v.name ||
           coalesce(nullif(('-' || cnt + row_number() over (partition by v.name order by v.name) - 1), '-0'), '')
    from (values ('X'), ('X'), ('Y')) v(name) cross join lateral
         (select count(*) as cnt
          from t
          where split_part(t.name, '-', 1) = v.name
         ) n;
名称的不变性可能不是一个安全的假设。您可以使用类似的逻辑将一个添加到现有编号中:

insert into t (name)
    select v.name ||
           coalesce(nullif(('-' || cnt + row_number() over (partition by v.name order by v.name) - 1), '-0'), '')
    from (values ('X'), ('X'), ('Y')) v(name) cross join lateral
         (select max(cast(nullif(split_part(t.name, '-', 2), '') as int )) + 1 as cnt
          from t
          where split_part(t.name, '-', 1) = v.name
         ) n;
请注意,这两种解决方案都假定基
名称
没有连字符


是一个dbfiddle。

是否要更新当前数据,还是需要一个示例,说明如何插入新数据并附加生成的数字?是否确实需要此示例?在选择过程中,只将
id
附加到
名称
怎么样?如果将
id
(或“行号”应该是什么?)也保留在
name
列中,则会污染我要使用此功能插入新数据的列@朱利叶斯·塔斯肯尼斯是的,身份证也可以。事实上,如果可能的话,id是一个更好的选择@Islingret这个问题本身和所使用的例子暗示了一种误解。没有行号这样的东西。数据以属性集(行)的形式无序存储。您可以创建一个列,其值表示相对顺序,但它不是数据库固有的。它是用户定义的,用户处理的RDBMS对其用途一无所知。它是否总是附加(上一行+1)号@Julius TuskenisIt增加序列1,2,3。。。不知何故,当有两个并发事务时,计数记录可能会导致错误-它们都会计算相同的数字。使用序列是自动递增值的一个选项。实际上,我要做的是生成一个名称,该名称的末尾应该有一个特定的id。我的例子不适合这种情况。我只想在每个名称的末尾加上类似于“number+=1”(在python中)@戈登·林诺夫