在SQL中增加变量

时间:2016-05-16 20:08:03

标签: sql sql-server

我有一张没有任何自动增量的表格。我必须将数据插入此表,每次将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是以奇怪的方式创建的

5 个答案:

答案 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;