2015-02-23 284 views
0

我試圖將多行插入到SQL中。該表包含一個外部ID列,當使用該APP時,該ID將該ID加1。外部ID不是主鍵,而是表中的另一個ID。當前最後一個外部ID是544.我想插入1600個附加行,並且每插入一行,外部ID都會增加1。我曾嘗試以下,但所有的外部ID的最終成爲100如何讓SQL使用插入語句在列上將ID增加1

INSERT INTO tableA (externalid,tableuiduid) 
VALUES ((select ISNULL(MAX(EXTERNALID) +1, 0)from tableA),newid()); 

我也試過,但它最終插入一個重複的外部ID,因爲有在數字空白。

INSERT INTO tableA (ExternalID,tableAuid) 
VALUES ((select count (externalid) + from tableA),newid()); 

請讓我知道我需要用什麼來增加1,而不是插入重複的ID。

+0

什麼是數據庫平臺?在SQL Server中,您將使用標識列。 – 2015-02-23 18:49:55

+0

@RagingBull是的,但它也被MS Access使用。 – 2015-02-23 18:58:27

回答

0

你這樣做了,這取決於你的RDBMS的樣子,你可以使用一個INSERT INTO ... SELECT聲明:

INSERT INTO tableA (externalid, tableuiduid) 
select ISNULL(MAX(EXTERNALID) + 1, 0), newid() 
from tableA; 

但是,你需要執行的是1600次。

如果您有輔助數字表或使用遞歸CTE,您可以使用它一次生成1600行,但不知道RDBMS的精確實現是非常困難的。

您可以將該字段定義爲自動遞增字段或序列,但我認爲這不是一個好主意,因爲您並不總是要確定externalid值是什麼。

+0

使用這仍然使所有的外部ID爲100. – Derick 2015-02-23 19:19:12

+0

@Derick什麼數據類型是'externalid'?從tableA'中選擇MAX(EXTERNALID)是什麼? – 2015-02-23 19:24:44

+0

Datatype = varchar(25)並選擇返回99 – Derick 2015-02-23 19:28:57

0

您應該使用ISNULL以外的+1。並使用INSERT INTO .. SELECT

試試這個方法:

DECLARE @Cnt as int 
SET @Cnt = 0 

WHILE (@Cnt < 1600) 
BEGIN 
    INSERT INTO tableA (externalid,tableuiduid) 
    select ISNULL(MAX(EXTERNALID),0) + 1,newid() 
    from tableA 
    SET @Cnt = @Cnt + 1 
END 
+0

使用這仍然使所有的外部ID爲100. – Derick 2015-02-23 19:17:24

+0

@Derick:編輯我的答案。現在就試試。 「externalid」列中的最大值是多少? – 2015-02-23 19:26:03

+0

我也試過這個,它仍然是100.使用表A = 99中的select max(externalid)的最大值。我想我試圖找出應用程序如何增加外部ID,但是當我使用插入語句時,它只能達到100. – Derick 2015-02-23 19:46:29

0

首先創建一個序列。

create sequence seq1 
    start with 544 
    increment by 1 
    maxvalue 99999; 

然後插入。

INSERT INTO tableA (externalid) 
    VALUES (seq1.nextval()) 
+0

嘗試運行插入語句時接收以下錯誤。找不到列「seq1」或用戶定義的函數或聚合「seq1.nextval」,或名稱不明確。 – Derick 2015-02-23 19:20:30

+0

在運行插入查詢之前,您必須先創建序列。 – Arijit 2015-02-24 04:28:46