我有一张没有任何自动增量的表格。我必须将数据插入此表,每次将ID递增1000。
所以我有
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 :(得分:5)
您可以这样声明字段:
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 |
答案 1 :(得分:2)
您也可以使用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;
:
{{1}}
答案 2 :(得分:1)
没有什么可以阻止您执行以下操作并正确插入数据。
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 :(得分:1)
如果有2个用户同时尝试插入,则可以使用max(id)
获取竞争条件 - 他们最终都可以使用相同的id
值。您可以尝试使用GUID而不是整数ID(uniqueidentifier
类型)。使用NEWID()
函数,该函数始终返回新的唯一GUID号。从整数键转换为GUID键有点痛苦,但这是值得的。然而,性能略有下降,而且它们更难以阅读!一个很好的优点是,您可以将生产中的新数据导入测试数据库,而无需担心重复的密钥。
答案 4 :(得分:0)
您每次使用后都可以随时创建一个新的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;