2010-03-30 4 views
1

이메일 목록이 있습니다.mySQL 자동 증가 문제 : 키 1 중복 항목 '4294967295'

자동 증분 ID의 마지막 레코드는 적법한 레코드 인 3780입니다. 내가 삽입 한 새로운 레코드가 바로 삽입됩니다.

하지만, 내 로그에 나는 가끔이 하나님의 녹색 지구에 GET 너무 높은 뛰어 것 왜

Query FAIL: INSERT INTO mail.messages (timestamp_queue) VALUES (:time); 
Array 
(
    [0] => 23000 
    [1] => 1062 
    [2] => Duplicate entry '4294967295' for key 1 
) 

어떻게 든의 자동 증가가

4294967295의 INT 최대까지 뛰어? id 필드가있는 삽입이 없습니다.

해당 테이블의 표시 상태는, AUTO_INCREMENT 테이블은 지금 읽어 : 4294967296

어떻게 이런 일이 발생할 수 있을까? ID 필드가 아마도 큰 int 일 것임을 나는 깨닫는다. 그러나 내가 가지고있는 걱정은 어떻게 든이 물건이 다시 뛰어 오른다라는 것이다.

조쉬

편집 : 업데이트 난의 모습은 지난 몇 ID BIGINT 할 수있는 ID를 설정 때문에 5.0.45 빨간 모자

패치

MySQL 버전 :

3777 
3778 
3779 
3780 
4294967295 
4294967296 
4294967297 
4294967298 
4294967299 
4294967300 

로를 당신은 볼 수 있습니다, 그들은 격차없이 (지금까지) 증분입니다. 전혀 이상해.

+0

어떤 종류의 필드입니까? ID가 4294967296 인 행의 값에 단서가 있습니까? – Cups

+0

timestamp_sent는 INT (10)입니다. 값에 단서가 없습니다. 그들은 모두 완료되었습니다. 항상 준비된 문을 사용하므로 SQL 주입에 대해 걱정하지 않습니다. 흠. – Josh

+0

필드 길이 덮어 쓰기가 이와 같은 문제를 일으킬 수 있는지 궁금합니다. – Josh

답변

2

나에게 아직 완전히 명확하지는 않지만, 내가 후속 조치를 취할 것으로 생각했다.

내 영속성 엔진에서 자동 증가 ID 및 GUID ID가있는 하위 클래스가있는 한 가지 유형의 개체가 있습니다.

명백히 두 개는 호환되지 않습니다. 개체를 부모로 변환 한 다음 저장하는 이유가 있습니다. (기본적으로 하위 클래스는 추가 기능이있는 전자 메일 TEMPLATE이지만 실제로 전자 메일을 보내려고하면 부모 개체로 변환하여 저장합니다. 일반 보내는 메일 대기열). 어리석게도, ID 형식이 다르다는 것을 깨닫지 못했습니다. 이로 인해 36 자 긴 문자열이있는 레코드를 int에 삽입하려고했습니다. 준비된 명령문에서 '0'으로 해석 된 문자열은 어떠한 이유에서든 자동 증가 시스템이 원래 테이블의 INT 자동 증가 ID 필드를 WIG OUT 및 최대 값으로 만드는 원인이됩니다.

짧게 짧게, 좋은 점은 로그를 유지하는 것입니다. phpMyAdmin에 의해

조쉬

-1

그냥 BIGINT로 변경하면 "일부"추가 새 레코드를 만들 수 있습니다. 1 억 2 천억 ...)

0

은 단순히 당신이 실제로 너무 나에게 일어난 테이블

0

(이유는 아직 확실하지)의 작업 탭 지난 ID를 변경할 수 있습니다. 직감에 나는했다 :

ALTER TABLE `{table name here}` AUTO_INCREMENT = {your number here}; 
FLUSH TABLE `{table name here}`; 

그리고 그것을 고쳐 놓았던 것처럼 보인다. 먼저 자동 증가 값을 먼저 설정했지만 4294967295로 되돌아갔습니다.다시, 증분 값을 변경하고 플러싱이 작동하는 이유는 확실하지 않지만 (나는 데이터베이스 사용자가 아닙니다.) 다른 사람들에게 도움이 될 수 있으므로 여기에 게시 할 예정입니다.

4

동일한 번호의 동일한 문제가있었습니다. 내 문제는 int(10)에 내가 bigint(20)으로 변경했을 때 문제가 해결되었다는 것입니다.

다른 사람들이이 문제를 겪고있는 경우. 먼저 필드 크기를 확인하십시오. :)

-2

그것은 나에게도 일어났다. 문제는 어리석은 문제입니다.

그것은 그것 0 변환 character string 그리고 만약 integer, as in my case, where i was trying to insert a mobile no (in india it's 10 digits and starts with 9 like 9,123,456,789 ) into a int` 유형 항목을 수신하는 경우.

그러나 signed int의 한계는 2147483647입니다.

unsigned으로 변환하려고 시도했지만 여전히 한도는 4294967295입니다. 따라서 "4294967295"오류가 발생하지만 으로 변환하면 9223372036854775807 (이는 10 자리 이동 번호가 더 많음) 제한을받습니다.

휴대 전화 용으로 아니요로 변환하여 18446744073709551615으로 제한을 변경했습니다.