2009-09-30 7 views
10

Ho una tabella MySQL con una colonna id autoincrementata. L'ID è iniziato da 1 ed è ora nei 4000.Cosa succede quando l'autoincremento si scontra con i dati esistenti in MySQL?

Tuttavia, ho anche bisogno di portare alcuni dati legacy in questa tabella da una vecchia versione dell'applicazione. Gli ID di questi dati partono da 5000 e devono essere conservati a fini di controllo.

Cosa succede se inserisco una voce dopo che il contatore di autoincremento è impostato su 4999? L'autoincremento è abbastanza intelligente da cercare il prossimo ID disponibile o si blocca perché tenta di inserire l'id 5000, che già esiste?

Mentre i consigli su come risolvere questo problema sono molto utili, mi piacerebbe anche capire cosa farebbe MySQL in questa situazione e se dovessi intervenire del tutto.

risposta

4

Autoincrement utilizzerà il prossimo ID disponibile per entrambe le tabelle InnoDB e MyISAM.

Ho provato questo per MySQL 4.1.22 in esecuzione su Windows Vista. Ho creato due semplici tabelle, una con InnoDB e l'altra con MyISAM. Ognuno aveva una chiave primaria autoincrementante chiamata 'id' e una colonna varchar chiamata 'descrizione'.

Ho eseguito il seguente comando (senza errori):

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; 

ho ottenuto il seguente risultato, che dimostra che la colonna 'id' è stato correttamente autoincremented:

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

ho ripetuto la sperimentare sulla mia tabella InnoDbTest con lo stesso risultato.

+0

Abbiamo qualcosa in corso in una tabella innoDB transazionale in cui è autoincrementante verso l'alto, ma al di sotto dell'ID massimo. Penso che questo semplice test sia semplicemente troppo semplice. Sono abbastanza sicuro che mysql salterà automaticamente gli ID esistenti, ma io non sono al 100% –

+0

Sì, abbiamo su innoDb autoincrement inferiore a max (id), non shure cosa succederà –

+0

Il problema con il test qui è che hai inserito con una normale istruzione di inserimento. Ho avuto un sacco di problemi in cui ho regolarmente ripristinato un database di produzione su un server di sviluppo e gli incrementi automatici del server di sviluppo non si aggiornano e quindi entrano in collisione con i record ora esistenti derivati ​​dalla produzione quando vado a creare una nuova voce in dev. –

6

autoincremento utilizzerà il prossimo ID disponibile per entrambe le tabelle InnoDB e MyISAM ma è possibile modificare manualmente è successiva posizione nel modo seguente:

Dopo l'inserimento, è possibile impostare l'incremento automatico per un valore al di sopra della società -Massima id:

ALTER TABLE tbl AUTO_INCREMENT = 9000; 
+0

+1: è molto probabile che ci siano più tabelle dei suoi dati precedenti, e questo è il modo migliore per aggirarlo. – nickf

+0

Non necessario, è fatto automaticamente. – DisgruntledGoat

0

Se si dispone di un solo tavolo eredità senza dipendenze sugli ID, quindi cosa farei è creare una tabella temporanea per inserire tutti i nuovi dati in (con l'ID 5000+) . Quindi eseguire questo:

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

DROP TABLE `temptable`; 

... dove nessuna colonna colonnaX è l'id auto_increment primario.

0

Provalo su un database di prova e vedere cosa succede, con lampp/xampp etc.

0

Credo controlli MySQL se si inserisce su una colonna auto-increment e aggiornerà AUTO_INCREMENT in modo che AUTO_INCREMENT> MAX (id), ma ho bisogno di consultare i documenti. Dovresti comunque seguire il suggerimento di Andrew Duffy, per essere sicuro.

0

MySQL non consente di impostare il "valore" auto_increment interno inferiore all'ID più alto corrente.

Pertanto, se si aggiungono 1000 righe a partire da 5000, l'incremento è impostato su 6000. È ancora possibile aggiungere righe con ID che non esistono ancora (ad es. 4500) ma non vale la pena preoccuparsi, davvero. Ci sono un sacco di numeri tra 6000 e 4 miliardi.

0

Se si inseriscono dati con chiavi primarie già assegnate in MyISAM, il valore della colonna AUTO_INCREMENT per l'inserto successivo sarà max (colonna) + 1, quindi funzionerà.

Tuttavia, se non si utilizza MyISAM poiché si tratta di dati importanti, si utilizza InnoDB, che richiede l'istruzione ALTER TABLE citata sopra.

Problemi correlati