Come già accennato precedentemente il campo AUTO_INCREMENT gestisce automaticamente la PRIMARY KEY di tipo INTEGER in modo tale che abbia un valore univoco sempre maggiore a quello precedentemente inserito, ecco cosa succede se proviamo ad inserirlo manualmente.
1a. Inserimento AUTO_INCREMENT forzato
Il DBMS MySQL permette l’inserimento tramite INSERT INTO… del valore AUTO_INCREMENT in maniera forzata come in questo statement:
INSERT INTO Persona ('personaID', 'nome', 'cognome', 'num_tel', 'cod_fis')
VALUE (5, 'Mario', 'Rossi', '+39 111555', 'MRRRSS');
In questo caso stiamo facendo un override ovvero una forzatura di un comportamento previsto dal sistema definito in DDL ed avrà come effetto il seguente risultato:
------------------------------------------------------------
| personaID | nome | cognome | num_tel | cod_fis |
------------------------------------------------------------
| 1 | Giovanni | Pace | +39 123456 | PCAGNN |
| 5 | Mario | Rossi | +39 111555 | MRRRSS |
------------------------------------------------------------
------------------------------------------------------------ | personaID | nome | cognome | num_tel | cod_fis | ------------------------------------------------------------ | 1 | Giovanni | Pace | +39 123456 | PCAGNN | | 5 | Mario | Rossi | +39 111555 | MRRRSS | ------------------------------------------------------------
Ovviamente notiamo come il salto da 1 a 5 comporterà un vuoto all’interno del nostro elenco dati ma per rispettare le caratteristiche di un valore AUTO_INCREMENT tutti i successivi inserimenti partiranno dal valore massimo assegnato per evitare collisioni.
Procediamo quindi all’inserimento di un ulteriore record senza specificare il campo personaID:
INSERT INTO Persona ('nome', 'cognome', 'num_tel', 'cod_fis')
VALUE ('Valeria', 'Verdi', '+39 222666', 'VLRVRD');
Lo statement avrà come effetto sulla tabela:
------------------------------------------------------------
| personaID | nome | cognome | num_tel | cod_fis |
------------------------------------------------------------
| 1 | Giovanni | Pace | +39 123456 | PCAGNN |
| 5 | Mario | Rossi | +39 111555 | MRRRSS |
| 6 | Valeria | Verdi | +39 222666 | VLRVRD |
------------------------------------------------------------
Incrementando ogni volta il valore di personaID partendo dal massimo valore presente in colonna eviterà la dichiarazione di un numero già assegnato in precedenza.
1b. Colmare i vuoti
Prendiamo come caso limite l’inserimento forzato di un record all’interno di uno spazio vuoto non assegnato nella tabella precedente, l’unico modo di inserire un record con personaID uguale a 3 è specificarlo esplicitamente nello statement:
INSERT INTO Persona ('personaID', 'nome', 'cognome', 'num_tel', 'cod_fis')
VALUE (3, 'Marika', 'Mariko', '+39 333777', 'MRKMRK');
Lo statement avrà come risultato:
------------------------------------------------------------
| personaID | nome | cognome | num_tel | cod_fis |
------------------------------------------------------------
| 1 | Giovanni | Pace | +39 123456 | PCAGNN |
| 3 | Marika | Mariko | +39 333777 | MRKMRK |
| 5 | Mario | Rossi | +39 111555 | MRRRSS |
| 6 | Valeria | Verdi | +39 222666 | VLRVRD |
------------------------------------------------------------
I successivi inserimenti comunque rispetteranno sempre le regole appena illustrate nell’AUTO_INCREMENT se non specificato in maniera forzata:
INSERT INTO Persona ('nome', 'cognome', 'num_tel', 'cod_fis')
VALUE ('Giorgio', 'Giorgi', '+39 444888', 'GRGGRG');
------------------------------------------------------------
| personaID | nome | cognome | num_tel | cod_fis |
------------------------------------------------------------
| 1 | Giovanni | Pace | +39 123456 | PCAGNN |
| 3 | Marika | Mariko | +39 333777 | MRKMRK |
| 5 | Mario | Rossi | +39 111555 | MRRRSS |
| 6 | Valeria | Verdi | +39 222666 | VLRVRD |
| 7 | Giorgio | Giorgi | +39 444888 | GRGGRG |
------------------------------------------------------------
Non esiste un modo per riempire automaticamente i vuoti all’interno di una colonna definita come AUTO_INCREMENT; concettualmente un comportamento tale è molto pericoloso poiché vedremo più avanti con eliminazione e modifica che andrebbe a cozzare con il SAFE UPDATE introdotto dalla versione 8.x di MySQL.