3.6.9 AUTO_INCREMENT 사용
AUTO_INCREMENT
속성을 사용하면 새로운 행에 고유 식별자를 생성 할 수 있습니다.
CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR (30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO animals (name) VALUES ( 'dog') ( 'cat') ( 'penguin') ( 'lax') ( 'whale') ( 'ostrich'); SELECT * FROM animals;
다음의 결과가 표시됩니다.
+----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+
AUTO_INCREMENT
컬럼에 값이 지정되지 않았기 때문에 MySQL이 자동으로 시퀀스 번호를 할당했습니다. 컬럼에 명시 적으로 0을 할당 시퀀스 번호를 생성 할 수 있습니다. 컬럼이 NOT NULL
로 선언 된 경우 NULL
할당 시퀀스 번호를 생성 할 수 있습니다.
SQL 함수 LAST_INSERT_ID()
또는 C API 함수 mysql_insert_id()
를 사용하면 마지막에 생성 된 AUTO_INCREMENT
값을 얻을 수 있습니다. 이 함수는 연결에 고유의 함수이기 때문에 다른 연결뿐만 아니라 삽입을 실행하고 있어도, 반환 값은 영향을받지 않습니다.
AUTO_INCREMENT
컬럼에 필요한 최대 시퀀스 값을 보관 유지하는데 충분한 크기를 가지는 최소의 정수 데이터 형식을 사용합니다. 컬럼 데이터 형의 상한 값에 도달하면 다음 시퀀스 번호를 생성하려고 할 때 실패합니다. 가능하면 넓은 범위를 가능하게하기 위해 UNSIGNED
속성을 사용합니다. 예를 들어, TINYINT
를 사용하는 경우 허용되는 최대 시퀀스 번호는 127입니다. TINYINT UNSIGNED
의 경우 최대 값은 255입니다. 모든 정수형의 범위는 섹션 11.2.1 "정수형 (정확한 숫자) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT" 를 참조하십시오.
여러 줄을 동시에 삽입하는 경우, LAST_INSERT_ID()
와 mysql_insert_id()
는 실제로 처음에 삽입 된 행의 AUTO_INCREMENT
키를 돌려줍니다. 그러면 복제 설정에 여러 줄의 삽입을 다른 서버에서 제대로 재현 할 수 있습니다.
1 이외의 AUTO_INCREMENT
값으로 시작하려면 다음과 같이 그 값을 CREATE TABLE
또는 ALTER TABLE
로 설정합니다.
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
InnoDB의주의
InnoDB
테이블에서는 일련의 INSERT
문 도중에 자동 증가 값을 포함한 컬럼을 수정하는 경우는주의가 필요합니다. 예를 들어, UPDATE
문을 사용하여 자동 증가 컬럼에 새로운 더 큰 값을 넣으면 후속 INSERT
는 "중복"오류가 발생할 수 있습니다. DELETE
를 실행 한 후에 더 INSERT
문이 계속되는 경우, 또는 트랜잭션을 COMMIT
했지만 UPDATE
문 뒤에가 아닌 경우에 자동 증가 값이 이미 존재 여부 테스트가 이루어집니다.
MyISAM주의
MyISAM
테이블에는 멀티 컬럼 인덱스의 보조 컬럼에AUTO_INCREMENT
를 지정할 수 있습니다. 이 경우AUTO_INCREMENT
컬럼에 생성 된 값은MAX(
로 계산됩니다. 이는 데이터를 정렬 된 그룹으로 분할하는 경우에 유용합니다.auto_increment_column
) + 1 WHERE prefix=given-prefix
CREATE TABLE animals ( grp ENUM ( 'fish', 'mammal', 'bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR (30) NOT NULL, PRIMARY KEY (grp, id) ) ENGINE = MyISAM; INSERT INTO animals (grp, name) VALUES ( 'mammal', 'dog') ( 'mammal', 'cat') ( 'bird', 'penguin') ( 'fish', 'lax') ( 'mammal', 'whale') ( 'bird', 'ostrich'); SELECT * FROM animals ORDER BY grp, id;
다음의 결과가 표시됩니다.
+--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+
이 경우 (
AUTO_INCREMENT
컬럼이 다중 컬럼 인덱스의 일부로 사용되는 경우) 그룹 내에서 최대의AUTO_INCREMENT
값이있는 행을 삭제하면 그 그룹에서 같은AUTO_INCREMENT
값이 다시 사용되게됩니다. 이것은 일반적으로AUTO_INCREMENT
값이 재사용 될 수없는MyISAM
테이블의 경우에도 발생합니다.AUTO_INCREMENT
컬럼이 복합 인덱스의 일부인 경우, MySQL은AUTO_INCREMENT
컬럼으로 시작하는 인덱스를 사용하여 시퀀스 값을 생성합니다 (있는 경우). 예를 들어,animals
테이블에 인덱스PRIMARY KEY (grp, id)
및INDEX (id)
이 포함되어있는 경우, MySQL은 시퀀스 값의 생성에서PRIMARY KEY
를 무시합니다. 그 결과 테이블에는grp
값마다 하나의 시퀀스가 아니라 하나의 시퀀스를 포함 할 수 있습니다.
참조
AUTO_INCREMENT
에 관한 세부 사항 참조를 보여줍니다.
컬럼에
AUTO_INCREMENT
속성을 할당하는 방법 : 섹션 13.1.17 "CREATE TABLE 구문」 및 섹션 13.1.7 "ALTER TABLE 구문」 .AUTO_INCREMENT
의NO_AUTO_VALUE_ON_ZERO
SQL 모드에 의한 동작의 차이 : 섹션 5.1.7 "서버 SQL 모드" .LAST_INSERT_ID()
함수를 사용하여 최신의AUTO_INCREMENT
값을 찾는 방법 : 섹션 12.14 "정보 함수" .사용하는
AUTO_INCREMENT
값 설정 : 섹션 5.1.4 "서버 시스템 변수" .AUTO_INCREMENT
과 복제 : 섹션 17.4.1.1 "복제 및 AUTO_INCREMENT" .복제에 사용 가능
AUTO_INCREMENT
관련 서버 시스템 변수 (auto_increment_increment
과auto_increment_offset
) : 섹션 5.1.4 "서버 시스템 변수" .