Brook Preloader

DML, i campi AUTO_INCREMENT

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.