嗨,大家好我只是有一個快速的問題:SQL服務器標識列插入失敗
當一個INSERT語句上的標識列失敗會發生什麼?
是否有可能說,例如,如果我插入一個標識列的行,該標識列將是1,並再次插入,但失敗,不插入和數據。然後嘗試再次插入,該行的身份現在是3?
任何意見將不勝感激。
謝謝。
嗨,大家好我只是有一個快速的問題:SQL服務器標識列插入失敗
當一個INSERT語句上的標識列失敗會發生什麼?
是否有可能說,例如,如果我插入一個標識列的行,該標識列將是1,並再次插入,但失敗,不插入和數據。然後嘗試再次插入,該行的身份現在是3?
任何意見將不勝感激。
謝謝。
這取決於數據插入失敗的原因是什麼。如果例如這些值是無效的(錯誤的類型),那麼標識值將不會增加。但是,如果第一次插入成功,但隨後被刪除(通過事務失敗並回滾),則標識值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
僅因爲一列有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)。
的一種方法是,以防止所述插入如果行已存在。
IF (Not Exists (Select ID From Table Where SomeCol = @SomeVal) Insert Into Table Values (@SomeVal)