在insert into语句中将列ID增加1

时间:2016-06-22 19:03:57

标签: sql postgresql

我有一个我想要根据另外两个表插入的表。

在我插入的表中,我需要找到Max值,然后每次都做+1,基本上为我插入的每个2000值创建新的ID。

我试过像

这样的东西
MAX(column_name) + 1

但它没有用。我不能使列成为IDENTITY,理想情况下,增量应该在INSERT INTO ... SELECT ...语句中。

非常感谢!

3 个答案:

答案 0 :(得分:0)

您可以使用表中的最后一个值声明一个变量,并将其放在insert语句中,如下所示:

DECLARE @Id INT SET @Id =(选择TOP 1 Id来自YoutTable ORDER BY DESC)

INSERT INTO YourTable VALUES(@Id,Value,Value)

答案 1 :(得分:0)

如果是mysql,你可以这样做..

insert into yourtable 
select 
@rownum:=@rownum+1 'colname', t.* from yourtable t, (SELECT @rownum:=2000) r 

here

生成rownumber的示例

如果是postgresql,可以使用

insert into yourtable 
    select t.*,((row_number() over () ) + 2000) from yourtable t

请注意,两个查询的选择顺序不同,您可能需要相应地调整insert语句。

答案 2 :(得分:0)

使用序列,它们的用途是什么。

create sequence table_id_sequence;

然后将序列调整为当前最大值:

select setval('table_id_sequence', (select max(id_column) from the_table));

以上只需要做一次。

设置序列后,请始终将其用于任何后续插入:

insert into (id_column, column_2, column_3)
select nextval('table_id_sequence'), column_2, column_3
from some_other_table;

如果你永远不会有任何并发​​插入该表(但只有那时)你可以使用max() + 1

insert into (id_column, column_2, column_3)
select row_number() over () + mx.id, column_2, column_3
from some_other_table
   cross join (
      select max(id_column) from the_table
   ) as mx(id);

但是再次:对于并发插入,上面的不安全

序列解决方案也将表现更好(特别是如果目标表的大小增加)