2009-09-30 6 views
10

나는 autoincremented id 컬럼을 가진 MySQL 테이블을 가지고있다. ID는 1에서 시작하여 현재 4000 초입니다.autoincrement가 MySQL의 기존 데이터와 충돌하면 어떻게됩니까?

그러나 이전 버전의 응용 프로그램에서이 테이블로 일부 레거시 데이터를 이식해야합니다. 이 데이터의 ID는 5000부터 시작하며 감사를 위해 보존해야합니다.

자동 증가 카운터가 최대 4999 인 항목을 삽입하면 어떻게됩니까? autoincrement는 다음 사용 가능한 ID를 찾을만큼 충분히 똑똑합니까? 이미 존재하는 ID 5000을 삽입하려고 시도하기 때문에 충돌이 발생합니까?

이 문제를 해결하는 방법에 대한 조언은 매우 유용하지만이 상황에서 MySQL이 어떤 역할을하는지, 그리고 개입해야하는지 이해하고 싶습니다.

답변

4

자동 증가는 InnoDB와 MyISAM 테이블 모두에서 다음 사용 가능한 ID를 사용합니다.

Windows Vista에서 실행되는 MySQL 4.1.22에 대해이를 테스트했습니다. InnoDB를 사용하는 간단한 테이블과 MyISAM을 사용하는 간단한 테이블 두 개를 만들었습니다. 각각에는 'id'라는 자동 증가 기본 키와 'description'이라는 varchar 열이 있습니다.

INSERT INTO MyIsamTest (description)  VALUES ('autoincrement id insert'); 
INSERT INTO MyIsamTest (id, description) VALUES (100, 'manual id insert'); 
INSERT INTO MyIsamTest (description)  VALUES ('autoincrement id insert'); 

SELECT * FROM MyIsamTest; 

나는 'ID'열이 제대로 autoincremented 것을 보여줍니다 다음과 같은 결과를 얻었다 : 나는를

+=====+=========================+ 
| id | description    | 
+=====+=========================+ 
| 1 | autoincrement id insert | 
+-----+-------------------------+ 
| 100 | manual id insert  | 
+-----+-------------------------+ 
| 101 | autoincrement id insert | 
+-----+-------------------------+ 

반복

나는 (오류없이) 다음 명령을 실행 동일한 결과로 InnoDbTest 테이블을 실험 해보십시오.

+0

우리는 트랜잭션이있는 innoDB 테이블에서 어떤 일이 벌어지고있다.이 테이블은 위쪽으로 자동 증가하지만 최대 ID보다 아래에있다. 나는이 간단한 테스트가 너무 단순하다고 생각한다. 나는 mysql이 자동으로 기존의 ID를 건너 뛸 것이라고 확신하지만, 100 %가 아니다. –

+0

예, 우리는 innoDb 자동 증가 값이 max (id)보다 낮 으면 어떤 일이 일어나지 않을지를 알려준다. –

+0

테스트의 문제점은 정상적인 삽입 문과 함께 삽입됩니다. 내가 dev에 서버에 프로덕션 데이터베이스를 정기적으로 복원 한 dev에 서버의 자동 증가가 업데이 트되지 않습니다 따라서 생산에서 가져온 기존의 레코드와 충돌 따라서 내가 굉장히 많은 문제가 생겼어요 dev에 새 항목이 있습니다. –

6

자동 증가가 이노와의 MyISAM 테이블에 모두 사용 가능한 다음 ID를 사용하지만 수동으로는 다음과 같은 방법으로 다음 위치의 변경 : 당신은 지금 위의 값으로 자동 증가를 설정할 수 있습니다, 귀하의 삽입 후

-highest ID :

ALTER TABLE tbl AUTO_INCREMENT = 9000; 
+0

+1 - 레거시 데이터의 여러 테이블이있을 가능성이 높습니다. 그리고 이것이 주변의 가장 좋은 방법입니다. – nickf

+0

필요하지 않지만 자동으로 수행됩니다. – DisgruntledGoat

0

경우에만 식별자에 종속되지 하나 개 기존 테이블이있는 경우는, 다음 내가했던 것과합니다 (ID를 5000로)에 모든 새로운 데이터를 삽입하는 임시 테이블을 만드는 것입니다 . 그런 다음이를 실행하십시오.

INSERT INTO `myrealtable` (column1, column2, column3) 
SELECT column1, column2, column3 
FROM `temptable`; 

DROP TABLE `temptable`; 

... 여기서 columnX 열은 1 차 auto_increment id입니다.

0

테스트 데이터베이스에 그것을 밖으로 시도하고 당신이 자동 증가 열을 삽입하고 AUTO_INCREMENT를 업데이트하면 내가 MySQL의 검사를 믿는 lampp를/XAMPP 등

0

으로, 무슨 일이 일어 나는지 있도록 AUTO_INCREMENT> MAX (ID),하지만 나는 문서를 살펴볼 필요가있다. Andrew Duffy의 제안에 따라 안전해야합니다.

0

MySQL은 내부 auto_increment "value"를 현재 가장 높은 ID보다 낮게 설정할 수 없습니다.

따라서, 5000에서 시작하는 1000 개의 행을 추가하면 증분이 6000으로 설정됩니다. 아직 존재하지 않는 ID (예 : 4500)를 가진 행을 추가 할 수는 있지만 실제로는 별 가치가 없습니다. 6000에서 40 억 사이의 숫자가 많이 있습니다.

0

이미 할당 된 기본 키가있는 데이터를 MyISAM에 삽입하면 다음 삽입을위한 AUTO_INCREMENT 컬럼의 값은 max (column) + 1이되어 작동하게됩니다.

그러나 중요한 데이터이므로 MyISAM을 사용하고 있지는 않습니다. 위에 인용 된 ALTER TABLE 문이 필요한 InnoDB를 사용하고 있습니다.

관련 문제