Strumenti Utente

Strumenti Sito


sql:sqlite-nonsequecekey

Come aggiustare tabella con campo chiave incrementale contenente salti nella progressione.


Situazione di partenza:

Tavola iniziale con idPersona = 1,2,9,11,12,13,19
Tavola finale con idPersona = 1,2,3,4,5,6,7

Explain table Persone;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| idPersona     | int(11)      | NO   | PRI | NULL    | auto_increment |
| Nome          | varchar(45)  | NO   |     | NULL    |                |
| Cognome       | varchar(45)  | NO   | MUL | NULL    |                |
| Email         | varchar(45)  | YES  |     | NULL    |                |
| Indirizzo     | varchar(150) | YES  |     | NULL    |                |
| DDN           | varchar(45)  | YES  |     | NULL    |                |
| Paese         | varchar(45)  | YES  |     | NULL    |                |
| IP            | varchar(15)  | YES  |     | NULL    |                |
| Dominio       | varchar(45)  | YES  |     | NULL    |                |
| Provider      | varchar(45)  | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

Dopo l’inserimento con la procedura Genera.py, non esistono chiavi doppie, ma esistono buchi nella sequenza di idPersona per risolvere, stando almeno a #ChatGPT, la soluzione è la seguente:

Creare una tabella temporanea escludendo il campo idPersona e creandone uno nuovo, in questo esempio nuovo_id con il seguente comando:

create table New_Persone as SELECT ROW_NUMBER() OVER (ORDER BY idPersona) as nuovo_id, Nome, Cognome, Email, Indirizzo, DDN, Paese, Dominio Provider from Persone;

In questo modo avrò creato una tabella di nome New_Persone con la seguente struttura:

Explain Table New_Persone;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| nuovo_id      | bigint(21)   | NO   |     | NULL    |       |
| Nome          | varchar(45)  | NO   |     | NULL    |       |
| Cognome       | varchar(45)  | NO   |     | NULL    |       |
| Email         | varchar(45)  | YES  |     | NULL    |       |
| Indirizzo     | varchar(150) | YES  |     | NULL    |       |
| DDN           | varchar(45)  | YES  |     | NULL    |       |
| Paese         | varchar(45)  | YES  |     | NULL    |       |
| Provider      | varchar(45)  | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

Il cui nuovo campo nuovo_id avrà la numerazione della riga in modo progressivo senza interruzioni dovute alle chiavi doppie create originalmente. A questo punto droppare, o salvare con altro nome, la tavola originale Persone e rinominare la temporanea :

  • drop table Persone oppure RENAME TABLE Persone TO Persone_Backup

e successivamente rinominare la tabella temporanea in quella originale con

  • RENAME TABLE New_Persone TO Persone;

e concludiamo riportando il nome colonna originale nella nuova tabella

  • ALTER TABLE Persone RENAME COLUMN nuovo_id TO idPersona; ## Considerazioni

Probabilmente ci sono anche altri modi che voglio sperimentare, tipo cambiare tipo di chiave, riassegnare i valori corretti progressive e poi rimettere il campo a tipologia incrementale.

Ma alla fine, tutto sto casino servirà davvero al mio progetto? Probabilmente no, ma almeno avrò imparato una cosa nuova, nel caso dovesse mai servirmi per qualche motivo vitale davvero per una applicazione!!



Joseph Curto 24/07/2023 15:27 - Ultima modifica: 03/08/2023 12:13

sql/sqlite-nonsequecekey.txt · Ultima modifica: 24/03/2024 09:40 da 127.0.0.1