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是在一个奇怪的方式创建
没有什么能够阻止您完成以下操作并正确插入数据。
insert into table1(ID,DATA)
VALUES ((select max(id) from table1 as T) +1000, DATA),
((select max(id) from table1 as T) +1000, DATA);
或者是你的意思吗?
我相信子查询是在插入之前计算的,所以这两个子查询会产生相同的值。 –
我不这么认为,我测试没有问题,在MySQL – Spade
这似乎并不适用于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 |
你也可以做到这一点使用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键是一件很痛苦的事情,但这是值得的。然而,有一个轻微的表现打击,他们更难以阅读!一个很好的优点是您可以将生产中的新数据导入到测试数据库中,而无需担心重复密钥。
只要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;
创建一个循环,每次迭代一个插件,增加@maxid在每次迭代。 –
您是否考虑过可能使用类似于计数表的东西,例如可以按照您的要求进行自定义的预填充整数表格,以及通过与计数表的连接执行INSERTS ....您的方式'd至少有一个镜头,以避免迭代/循环插入的费用 –
不幸的是,这是一个工作表,所以我无法改变任何东西 –