SQL中的增量变量

问题描述:

我有一个没有任何自动增量的表。我有1000SQL中的增量变量

将数据插入到这个表,每次递增ID所以我

SELECT @maxId = Max(ID) 
INSERT INTO TABLE1 
    (ID, DATA) 
VALUES 
    (@maxId + 1000, DATA), 
    (@maxId + 2000, DATA), 
    (@maxId + 3000, DATA) 

而不是明确地增加了每个插入的ID,有没有办法把它“汽车-增量'。我不能使用LAST_INSERT_ID()或类似的东西之一,只是因为ID是在一个奇怪的方式创建

+0

创建一个循环,每次迭代一个插件,增加@maxid在每次迭代。 –

+0

您是否考虑过可能使用类似于计数表的东西,例如可以按照您的要求进行自定义的预填充整数表格,以及通过与计数表的连接执行INSERTS ....您的方式'd至少有一个镜头,以避免迭代/循环插入的费用 –

+0

不幸的是,这是一个工作表,所以我无法改变任何东西 –

没有什么能够阻止您完成以下操作并正确插入数据。

insert into table1(ID,DATA) 
VALUES ((select max(id) from table1 as T) +1000, DATA), 
     ((select max(id) from table1 as T) +1000, DATA); 

或者是你的意思吗?

+3

我相信子查询是在插入之前计算的,所以这两个子查询会产生相同的值。 –

+0

我不这么认为,我测试没有问题,在MySQL – Spade

+1

这似乎并不适用于Microsoft SQL Server管理 –

你可以声明栏是这样的:

MyID INT IDENTITY (0,1000); 

这将自动增加1000每条记录。

例如:

CREATE TABLE MyTable 
(
    MyID INT IDENTITY(0,1000), 
    SField VARCHAR(128) 
); 

INSERT INTO MyTable (SField) VALUES ('TEST'); 
INSERT INTO MyTable (SField) VALUES ('TEST1'); 
INSERT INTO MyTable (SField) VALUES ('TEST2'); 


SELECT * FROM MyTable 

将产生以下结果:

| MyID | SField | 
----------------- 
| 0 | TEST | 
| 1000 | TEST1 | 
| 2000 | TEST2 | 
+0

在我看来,OP表示自动增量不是一个选项 –

+0

我反过来读它,他手动插入ID,但他希望它自动递增 – ArturoAP

+2

身份(从我读的)必须是在创建表时声明。那是对的吗? –

你也可以做到这一点使用ROW_NUMBER()

with v(data) as (
     select v.*, row_number() over (order by (select null)) as seqnum 
     from (values(data), (data), (data)) v 
    ) 
insert into table1 (id, data) 
    select @maxid + seqnum * 1000, data 
    from v; 

你可以使用max(id)如果用户试图在同一时间插入一个竞争条件 - 他们都用相同的id值结束。您可以尝试使用GUID而不是整数ID(uniqueidentifier类型)。使用NEWID()函数,它总是返回一个新的唯一的GUID号码。将整数键转换为GUID键是一件很痛苦的事情,但这是值得的。然而,有一个轻微的表现打击,他们更难以阅读!一个很好的优点是您可以将生产中的新数据导入到测试数据库中,而无需担心重复密钥。

+0

只要GUID不是你的聚集索引他们工作得很好....但正如前面提到他们很痛苦的工作。 –

,你总是可以只上创建一个新的sequence飞的下落它每次使用后的时间..

CREATE SEQUENCE CountBy1000 
    START WITH 1000 
    INCREMENT BY 1000 ; 

INSERT INTO Table1 
VALUES ((select max(id) from table1 as T) + NEXT VALUE FOR CountBy1000, DATA), 
     ((select max(id) from table1 as T) + NEXT VALUE FOR CountBy1000, DATA); 

DROP SEQUENCE CountBy1000;