MySQL에서 auto increment를 사용한 테이블 생성은 다음과 같다.

CREATE TABLE auto_increment_test_table (
  ID INT AUTO_INCREMENT PRIMARY KEY,
  NAME VARCHAR(255)
);


그렇다면 Derby에서는 어떻게 auto increment를 사용할 수 있을까?

SQL 문은 어느 정도 표준이 있다는 헛된 꿈을 안고 동일하게 시도하였으나,

다음과 같은 에러에 직면했다.

ERROR 42X01: Syntax error: Encountered "AUTO_INCREMENT" at line 2, column 10.

Derby는 도대체 AUTO_INCREMENT가 뭔소리냐고 한다.

쩝. 새삼스럽지 않다. 오라클에서도 동일한 문제가 있었기 때문에.

할 수 없이 Derby 매뉴얼을 뒤져서 다음 섹션을 발견하였다.

http://db.apache.org/derby/docs/dev/ref/ref-single.html#crefjavstateautogen

섹션에 설명대로 다음과 같이 작성하니 잘 동작하였다.

CREATE TABLE auto_increment_test_table (
  ID INT GENERATED ALWAYS AS IDENTITY,
  NAME VARCHAR(255)
);


하지만 문제는 여기에서 그치지 않았다.

auto increment가 적용된 테이블에 MySQL과 동일한 방식으로 데이터를 넣으려는데

다음과 같은 문제가 발생하였다.

ERROR 42Z23: Attempt to modify an identity column 'ID'.

앞에서 사용했던 SQL 문은 다음과 같다.

INSERT INTO auto_increment_test_table VALUES ('NULL', 'izeye');

해보나마나겠지만,

MySQL에서는 중복된 키가 아니라면

임의의 숫자를 auto increment 값으로 할당할 수 있지만,

Derby에서는 역시 동일한 에러 메시지를 보여줄 뿐이었다.

임의의 숫자를 auto increment에 할당하는 SQL문은 다음과 같다.

INSERT INTO auto_increment_test_table VALUES ('10', 'izeye');

그렇다면, 내 지식 범위 내에서 해결책은 하나 밖에 없었다.

다음과 같이 필드명을 명시적으로 포함시키는 방법이다.

INSERT INTO auto_increment_test_table (NAME) VALUES ('izeye');

이는 MySQL 뿐만 아니라 Derby에서도 잘 동작하였다.

하지만 이 방법은 테이블의 필드 수가 많다면,

SQL 문이 길어지는 불편함이 있다.

Derby에서 auto increment 포함 테이블에 insert하는 방법 중에

위와 같이 명시적으로 필드명을 사용하지 않는 방법을 안다면,

comment plz :-)

Posted by izeye

댓글을 달아 주세요