언젠가 발생할 수있는 문제에 대해 조금 연구를하고 있습니다. id와 name 필드가있는 InnoDB MySQL 테이블이 있다고 가정 해 보겠습니다. id 필드는 BIGINT (20)이며 AUTO_INCREMENT와 기본 키입니다.자동 증가 값이 한계에 도달하면 어떻게해야합니까?
이 테이블이 꽉 차서 ID의 한도에 도달했으며 더 이상 자동 증가 번호를 생성 할 수 없다는 것을 어떻게 알 수 있습니까?
언젠가 발생할 수있는 문제에 대해 조금 연구를하고 있습니다. id와 name 필드가있는 InnoDB MySQL 테이블이 있다고 가정 해 보겠습니다. id 필드는 BIGINT (20)이며 AUTO_INCREMENT와 기본 키입니다.자동 증가 값이 한계에 도달하면 어떻게해야합니까?
이 테이블이 꽉 차서 ID의 한도에 도달했으며 더 이상 자동 증가 번호를 생성 할 수 없다는 것을 어떻게 알 수 있습니까?
은의이 같은 테이블 구조를 가정 해 보자 표에 나와 있는데 그들은쿼리에도 포함되어 있지만이 특정 문제에 아무런 가치가 없기 때문에 무시해도됩니다.
열 id
의 값이 최대 값에 도달하면 위 쿼리를 사용하여 더 이상 행을 테이블에 삽입 할 수 없습니다. 다음 INSERT
오류와 함께 실패합니다
SQL Error (167): Out of range value for column 'id'.
id
컬럼의 값에 차이가있는 경우, 당신은 여전히 테이블에없는 값을 사용하여 행을 삽입 할 수 있지만 당신이 id
에 대한 값을 지정해야 INSERT
쿼리 당신의 AUTO_INCREMENT
컬럼의 유형 인 경우
어쨌든, BIGINT
당신은 걱정할 필요가 없습니다. 코드를 가정
다음 half of million years에 대한 id
열의 백만 레코드를 각각 두 번째 (이 매우 과대 평가, 불가능 말 안하기), 거기에 충분한 값을 삽입합니다. 또는 열이 UNSIGNED
이 아닌 경우에만 292,277
년이됩니다.
AUTO_INCREMENT
에드 PK로
INT(11)
(그리고
UNSIGNED
)를 사용하여 한 라이브 웹 서버의 행동을 목격했다. 한밤중에, 수시로 원활하게 달리고, 방문수가
2^31
(
2
억)에 달했을 때 실패했습니다.
열 유형을 INT
에서 BIGINT
으로 변경하는 것은 20 억 개의 레코드 테이블에 대한 솔루션이 아닙니다 (시스템을 완료하는 데 시간이 오래 걸리며 시간이 충분하지 않습니다).용액하지만 PK 열과 AUTO_INCREMENT
열에 대한 초기 값 BIGINT
와 동일한 구조를 갖는 새로운 테이블을 작성하고,이어서 표 전환 :
CREATE TABLE `tbl_new` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=2200000000;
RENAME TABLE `tbl` TO `tbl_old`, `tbl_new` TO `tbl`;
이 훌륭한 답변 주셔서 감사합니다! :) – Sharpy35
tinyint: 1 byte, -128 to +127/0 to 255 (unsigned)
smallint: 2 bytes, -32,768 to +32,767/0 to 65,535 (unsigned)
mediumint: 3 bytes, -8,388,608 to 8,388,607/0 to 16,777,215 (unsigned)
int/integer: 4 bytes, -2,147,483,648 to +2,147,483,647/0 to 4,294,967,295 (unsigned)
bigint: 8 bytes, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807/0 to 18,446,744,073,709,551,615 (unsigned)
이 숫자가 작은 숫자라고 생각 했습니까? 다른 컬럼도 있습니다 실제 코드에서
INSERT INTO tbl(id) VALUES (NULL);
: 같은
CREATE TABLE `tbl` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
);
및 INSERT
쿼리 :이 번호를 달성하기 전에, 어쩌면 당신이 죽은 것
'code'tinyint 1 바이트 -128을 +127/0 ~ 255 (부호 없음) smallint : 2 바이트, -32,768 ~ +32,767/0 ~ 65,535 (부호 없음) mediumint : 3 바이트, -8,388,608 ~ 8,388,607 ~ 0 ~ 16,777,215 (부호 없음) int/integer : 4 바이트, -2,147,483,648 ~ +2,147,483,647/0 ~ 4,294,967,295 bigint : 8 바이트, -9,223,372,036854775808 ~ 9,223,372,036854775807/0 ~ 18,446,744,073,709,551,615 (부호 없음)'code' –
그런 다음 bigint를 부호없는 b igint. 그것이 가득 차면 아마도 MySQL 데이터베이스에서 가장 많은 데이터를 보유하고 있다는 기록을 세웠을 것입니다. auto_increment 컬럼을 사용하지 말고 작업을 수행하도록 내버려 두지 않는다고 가정하십시오. 제가 말하고자하는 것은 당신이 그것에 대해 걱정할 필요가 없다는 것입니다. 가능한 가장 큰 bigint 값이 얼마나 큰지 보셨습니까? 나는 모든 데이터베이스 사용자 중 90 %가 auto_increment 열의 32 비트 정수의 상한에 도달하지 않는다고 말하고 싶습니다. 그리고 당신은 64 비트 값에 대해 이야기하고 있습니다. – fancyPants
해당 번호에 도달하기 전에 시스템이 일몰 상태가됩니다. – Juan