2016-05-16 110 views
1

我有一個沒有任何自動增量的表。我有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

不幸的是,這是一個工作表,所以我無法改變任何東西 –

回答

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

我相信子查詢是在插入之前計算的,所以這兩個子查詢會產生相同的值。 –

+0

我不這麼認爲,我測試沒有問題,在MySQL – Spade

+1

這似乎並不適用於Microsoft SQL Server管理 –

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 | 
+0

在我看來,OP表示自動增量不是一個選項 –

+0

我反過來讀它,他手動插入ID,但他希望它自動遞增 – ArturoAP

+2

身份(從我讀的)必須是在創建表時聲明。那是對的嗎? –

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; 
1

你可以使用max(id)如果用戶試圖在同一時間插入一個競爭條件 - 他們都用相同的id值結束。您可以嘗試使用GUID而不是整數ID(uniqueidentifier類型)。使用NEWID()函數,它總是返回一個新的唯一的GUID號碼。將整數鍵轉換爲GUID鍵是一件很痛苦的事情,但這是值得的。然而,有一個輕微的表現打擊,他們更難以閱讀!一個很好的優點是您可以將生產中的新數據導入到測試數據庫中,而無需擔心重複密鑰。

+0

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

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;