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, '공지');
이렇게 테이블의 컬럼을 모두 명시해주어야 한다.
진짜 끝 :)