我有一个我想要根据另外两个表插入的表。
在我插入的表中,我需要找到Max值,然后每次都做+1,基本上为我插入的每个2000值创建新的ID。
我试过像
这样的东西MAX(column_name) + 1
但它没有用。我不能使列成为IDENTITY
,理想情况下,增量应该在INSERT INTO ... SELECT ...
语句中。
非常感谢!
答案 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);
但是再次:对于并发插入,上面的不安全。
序列解决方案也将表现更好(特别是如果目标表的大小增加)