DBMS/SQL Server (MS-SQL)

[SQL Server / MS-SQL] Error - An explicit value for the identity column in table 'POST' can only be specified when a column list is used and IDENTITY_INSERT is ON.

RYEAN 2019. 9. 18. 15:51
반응형

 


 

 

Msg 8101, Level 16, State 1, Line 12

An explicit value for the identity column in table 'POST' can only be specified when a column list is used and IDENTITY_INSERT is ON.

 

 

 

위 오류는 identity 속성이 적용된 테이블에 insert 를 하려고 할 때 발생하는 오류이다.

identity 은 자동으로 값을 늘려주는 기능으로 identity 로 설정한 컬럼은 insert 마다 자동으로 값이 증가한다.

 

그런데 내가 만약 identity 값을 지정하고 싶을 때, identity 컬럼에 값을 직접 넣어주면

위와 같은 오류가 발생한다.

 

예를 들어,

컬럼 SEQ 에 identity 를 적용한 상황에서

 

  • INSERT INTO TBL_POST (SEQ, TITLE) VALUES (1, '공지');

위 명령문을 실행하면 위의 오류가 발생한다.

 

나같은 경우엔,

TBL_POST_EX 라는 테이블에 컬럼 NUM, TITLE 이 있는 상태에서

 

  • INSERT INTO TBL_POST (SEQ, TITLE) SELECT * INTO TBL_POST_EX

위 명령문을 실행했다가 위의 오류가 발생했다.

왜냐하면 TBL_POST_EX 테이블의 NUM 컬럼이 TBL_POST 테이블의 SEQ 값을 임의로 입력하려 하였기 때문이다.

 

 

위 오류를 해결하기 위해서

 

  • SET IDENTITY_INSERT [테이블명] ON;      -- EX: SET IDENTITY_INSERT TBL_POST ON;

위 쿼리를 실행하면 identity 컬럼에 임의적으로 값을 입력할 수 있다.

위 기능을 ON 하면 identity 컬럼에 임의적으로 값을 입력하겠다 라는 의미이다.

 

위 쿼리를 실행 후 INSERT 를 시도하니 성공!

 

그리고 임의적으로 입력을 다 한 후에는 

 

  • SET IDENTITY_INSERT [테이블명] OFF;     -- EX: SET IDENTITY_INSERT TBL_POST OFF;

위 쿼리를 실행시켜 기능을 OFF 해야한다.

그래야 본래의 identity 기능을 정상적으로 사용할 수 있다.

 

해결!

 

 

그리고 identity 컬럼이 있을 때 INSERT 시,

반드시 컬럼을 명시해주어야 한다.

 

  • INSERT INTO TBL_POST VALUES (1, '공지');

위에 처럼 하면 안되고,

 

  • INSERT INTO TBL_POST (SEQ, TITLE) VALUES (1, '공지');

이렇게 테이블의 컬럼을 모두 명시해주어야 한다.

 

 

 

진짜 끝 :)

 

 

반응형