2011-11-02 49 views
2

嗨,大家好我只是有一個快速的問題:SQL服務器標識列插入失敗

當一個INSERT語句上的標識列失敗會發生什麼?

是否有可能說,例如,如果我插入一個標識列的行,該標識列將是1,並再次插入,但失敗,不插入和數據。然後嘗試再次插入,該行的身份現在是3?

任何意見將不勝感激。

謝謝。

回答

5

這取決於數據插入失敗的原因是什麼。如果例如這些值是無效的(錯誤的類型),那麼標識值將不會增加。但是,如果第一次插入成功,但隨後被刪除(通過事務失敗並回滾),則標識值IS遞增。

-- Next identity value = 1 
INSERT INTO Table1 (
    field1) 
VALUES ('a') 

-- Next identity value = 2  
BEGIN TRAN 
INSERT INTO Table1 (
    field1) 
VALUES ('b') 

-- Next identity value = 3  
ROLLBACK TRAN 

-- Next identity value = 3, although the insertion was removed.  
INSERT INTO Table1 (
    field1) 
VALUES ('c') 

-- Next identity value = 4 

第一插入將具有標識列值= 1,第二個出現故障,而第三個將具有標識列值= 3

1

僅因爲一列有IDENTITY規範並不一定意味着它是唯一的。

如果你不要在該列上有一個唯一的約束(或主鍵約束),你可以肯定地插入多個相同的值到該列的行中。

通常情況下,雖然,你IDENTITY主鍵(或者至少對他們有UNIQUE約束),並在這種情況下,嘗試插入已經存在會導致錯誤的值(「獨一無二約束違反「或類似的東西)

爲了能夠將特定值插入到IDENTITY列中,您需要有SET IDENTITY_INSERT (table name) ON - 否則,SQL Server將阻止您爲IDENTITY列指定值。

爲了說明 - 嘗試:

-- create demo table, fill with values 
CREATE TABLE IdentityTest (ID INT IDENTITY, SomeValue CHAR(1)) 

INSERT INTO IdentityTest(SomeValue) VALUES('A'), ('B'), ('C') 

SELECT * FROM IdentityTest -- Output (1) 

-- insert duplicate explicit values into table 
SET IDENTITY_INSERT IdentityTest ON 

INSERT INTO IdentityTest(ID, SomeValue) VALUES(1, 'Z'), (2, 'Y') 

SET IDENTITY_INSERT IdentityTest OFF 

SELECT * FROM IdentityTest -- Output (2) 

-- add unique constraint 
TRUNCATE TABLE dbo.IdentityTest 

ALTER TABLE IdentityTest ADD CONSTRAINT UX_ID UNIQUE(ID) 

INSERT INTO IdentityTest(SomeValue) VALUES('A'), ('B'), ('C') 

SET IDENTITY_INSERT IdentityTest ON 

INSERT INTO IdentityTest(ID, SomeValue) VALUES(1, 'Z') -- error message (3) 

DROP TABLE IdentityTest 

輸出(1):

ID SomeValue 
1 A 
2 B 
3 C 

輸出(2):

ID SomeValue 
1 A 
2 B 
3 C 
1 Z 
2 Y 

錯誤消息(3):

消息2627,級別14,狀態1,行9
違反UNIQUE KEY約束'UX_ID'。不能在對象'dbo.IdentityTest'中插入重複鍵。重複的鍵值是(1)。

1

的一種方法是,以防止所述插入如果行已存在。

IF (Not Exists (Select ID From Table Where SomeCol = @SomeVal) Insert Into Table Values (@SomeVal)