2011-11-02 4 views
2

안녕하세요. 한 가지 간단한 질문이 있습니다.SQL Server ID 열 삽입이 실패합니다.

ID 열에서 삽입 문이 실패하면 어떻게됩니까?

예를 들어, ID 열이있는 행을 삽입하면 그 ID 열은 1이되고 다시 삽입되지만 실패하고 삽입 및 데이터가 삽입되지 않을 수도 있습니다. 그런 다음 다시 삽입하면 해당 행의 ID가 3이됩니다.

모든 조언을 주시면 감사하겠습니다.

감사합니다.

답변

5

데이터 삽입 오류의 원인에 따라 다릅니다. 예를 들어 값이 유효하지 않은 경우 (잘못된 유형), ID 값이 증가하지 않습니다. 그러나 첫 번째 삽입이 성공적이지만 트랜잭션이 실패하고 롤백되어 제거되면 ID 값이 증가합니다.

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

첫 번째 삽입 ID 열 값 = 1, 두 번째는 실패가되고, 세번째는 ID 열 값 = 3

1

열이 IDENTITY 사양을 가지고 있다고해서 반드시 고유 한 것은 아닙니다.

에 해당 열의 고유 제한 조건 (또는 기본 키 제약 조건)이없는 경우 해당 열의 행에 여러 개의 동일한 값을 삽입 할 수 있습니다.

일반적으로,하지만, 당신의 IDENTITY될 것 기본 키 (또는 적어도 그들에 UNIQUE 제약 조건이) 그 경우, 고유의 이미 오류가 발생합니다 존재하는 값을 ("삽입을 시도 위해 제약 조건 위반 "또는 그런 일이)

당신이 필요 IDENTITY 컬럼에 특정 값을 삽입 할 수 있도록 SET IDENTITY_INSERT (table name) ON - 그렇지 않으면, SQL 서버에도 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)

관련 문제