본문 바로가기

프로그래밍/MSSQL

IDENTITY_INSERT가 OFF로 설정되면 테이블 XXX ID 열에 명시적 값을 삽입할 수 없습니다.

개발하다, 아래와 같은 에러가 뜬다.

처리되지 않은 'Spring.Dao.DataIntegrityViolationException' 형식의 예외가 Spring.Data.dll에서 발생했습니다.

추가 정보: CommandCallback; SQL [INSERT INTO [Jopan] ([JopanNum],[JopanCode],[JopanSize],[PaperCount],[PaperMaterial],[WriteDate],[JopanState],[DeliveryDate],[FileDownAvailable],[Color],[IsDonTang],[ItemType],[MaterialCode]) 

VALUES (@insert_JopanNum,@insert_JopanCode,@insert_JopanSize,@insert_PaperCount,@insert_PaperMaterial,@insert_WriteDate,
@insert_JopanState,@insert_DeliveryDate,@insert_FileDownAvailable,@insert_Color,@insert_IsDonTang,@insert_ItemType,@insert_MaterialCode);

SET @SYS_RETURING_INSERT = CAST(SCOPE_IDENTITY() AS int)]; IDENTITY_INSERT가 OFF로 설정되면 테이블 'Jopan'의 ID 열에 명시적 값을 삽입할 수 없습니다.

DB Table 설계는 

CREATE TABLE [dbo].[XXXXX](
[jopanNum] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[jopanCode] [nvarchar](20) NOT NULL,
[jopanSize] [nvarchar](30) NULL,
[paperCount] int DEFAULT 0,
[paperMaterial] [nvarchar](30) NULL,
[writeDate] [datetime] DEFAULT GETDATE(),
[jopanState] [varchar](20) DEFAULT 'ORDER',
[deliveryDate] [varchar](50) NULL,
[fileDownAvailable] [int] NULL,
[color] [varchar](30) NULL,
[isDonTang] [int] DEFAULT 0,
[itemType] [varchar](50) NULL,
[materialCode] [varchar](30) NULL
)

IDENTITY(1,1) <= 자동 증가값을 설정.


해결 방법으로 

1.  INSERT구문 앞 뒤로  SET IDENTITY_INSERT Jopan ON/OFF를 해준다.

SET IDENTITY_INSERT Jopan ON

INSERT ~ VALUES ~ 

SET IDENTITY_INSERT Jopan OFF

2.  Insert할 때,  자동증가값이 설정된 Primary Key Column을 명시하지 않는 방법이 있음.

INSERT INTO JopanItem(jopanCode, siteNationCode, strOrderItemCode, makeOrderCount) 
                    SELECT * 
                    FROM OPENQUERY([linDB_{siteNationCode}],'
                    SELECT TOP 1 {code}, {siteNationCode}, strOrderItemCode, intOrderCount 
                        FROM [adprintNewDB].[dbo].tblorderItem 
                        WHERE intOrderNum = {orderNum} AND strOrderItemcode LIKE (''%{orderItemCode}'')      

           ')