Riordinare valori Auto-increment postato il 02/10/2013 00:42:46 nel forum programmazione, gdrcd, open source, hosting e modificato da overlord il 02/10/2013 00:49:29
Salve!
Ho una curiosità puramente scientifica che mi è sovvenuta guardando la tabella log del mio GDR (Basato su GDRCD5.1). Ho notato che a lungo andare, tra metti e togli, il valore ID del log (discorso valido per ogni alta tabella) finisce per diventare enorme e fortemente discontinuo. C'è un modo per far sì che tale valore venga resettato e torni continuo, senza bisogno di fare un TRUNCATE sulla tabella? :P
Vorrei conserve i dati contenuti XD
Suggerimenti?
SE NON MI FOSSI SPIEGATO:
ID | Nome
1 | Mario
2 | Gianni
5 | Francesco
12 | Giovanni
Vorrei che diventasse:
ID | Nome
1 | Mario
2 | Gianni
3 | Francesco
4 | Giovanni
E che la numerazione continuasse da questo nuovo valore.
Pagine → 1 2
02/10/2013 00:56:04
La domanda principale è...
quell'ID lo usi da qualche parte o è lì per "bellezza"?
per il resto magari ti rispondo domani che ora mi si stan chiudendo gli occhi
02/10/2013 01:24:09
Effettivamente quasi per bellezza, essendo quello dei log, ha uno scopo meramente cronologico/di ordine, non lo richiamo mai direttamente per modificare qualcosa. Servono solo a tenere traccia e quelli tengono traccia della taccia (sì, ero tentato di eliminare la colonna, se te lo stavi chiedendo XD).
02/10/2013 02:06:23
Ammetto che in pratica non so realmente che faccia quell'ID, perché dei LOG mi è sempre andato bene come li salvava e non l'ho toccato XD ho modificato tutto quello che ci sta attorno, ma credo che proprio l'ID, sia per una mera questione di ordine... Non lo so, questo controllerò, ma non è l'argomento della discussione XD
02/10/2013 07:54:34
SE il codice che stai utilizzando non lo conosci bene, ti sconsiglio vivamente la rimozione, la modifica o l'associazione del campo id in base al personaggio in quanto magari ci può essere qualche query che va a prendere i dati dell'utente in base proprio all'id e non al campo nome.
02/10/2013 10:12:19
Se quella colonna si chiama "chiave primaria" e non "chiave inutile" penso che un motivo ci sia.
È fortemente sconsigliato giocare in questo modo con gli id, perché è vero che alla lunga li hai discontinui, ma è anche vero che mezzo database si appoggia a quell'id per crearsi relazioni, vincoli o per fare semplici query. Modificarli ha senso solo nel caso in cui sei totalmente sicuro di non perdere vincoli durante il passaggio (on update cascade a manetta). Immagina la situazione:
Tabella1
ID: 1
Nome: Abe
ID: 3
Nome: Giuseppe
Tabella2
ID:1
ID_PERSONAGGIO: 1
ID:2
ID_PERSONAGGIO: 3
Se tu il record "Giuseppe" con id 3 lo fai diventare 2, potresti molto facilmente incorrere in questo risultato
Tabella1
ID: 1
Nome: Abe
ID: 2
Nome: Giuseppe
Tabella2
ID:1
ID_PERSONAGGIO: 1
ID:2
ID_PERSONAGGIO: 3
Ed ecco fatto. Nella Tabella2 hai un record che si riferisce ad un utente.. che non esiste! Giuseppe ha perso quel record (immagina fosse la riga che segnava uno degli oggetti in suo possesso), il db possiede dati inconsistenti. O magari poi metti qualcos'altro al posto dell'ID: 3, e ti ritrovi ad avere una persona con l'oggetto di quella precedente.
Se vuoi un consiglio: lascia perdere. Se hai ancora spazio nella chiave (ed immagino di sì, se è un int può arrivare fino a 4miliardi unsigned) lasciala incrementare a volontà. Tanto nessuno verrà mai a guardare la tua chiave primaria ed a criticarti perché ti sei saltato 100 numeri.
02/10/2013 13:30:26
Fermo restando che giocare con gli ID, anche se non fanno da referente a nessun altro campo in nessuna altra tabella, non è mai una buona idea.
Per fare quello che chiedevi all'inizio l'unica soluzione praticabile che ho trovato finora prevede la ricostruzione della tabella a partire da zero.
cioè qualcosa tipo un:
CREATE TABLE tabella_tmp SELECT NULL,campo_2,campo_3, campo_n FROM tabella ORDER BY campo_id;
A quel punto dovresti avere una tabella con gli stessi dati ma con l'id aggiornato e senza buchi.
Non resta che eliminare la tabella originale (o magari rinominarla finchè non sei sicuro che l'altra sia giusta) e rinominare la temporanea come quella originale.
E' discutibile l'utilità di compattare gli ID se non arrivano al limite del range che hai impostato nel campo relativo.
Come è già stato detto, ribadisco pure il concetto delle referenze. Se quell'ID viene utilizzato incrociandolo con altri dati da altre tabelle allora questa è un'operazione assolutamente da non fare, perché non solo ti farebbe perdere le referenze, ma le associazioni fra eventuali campi sarebbe proprio alterata (cioè se tu fai riferimento al campo 15 in un altra tabella, quel campo non sarà più 15 dopo la modifica e in più potrebbe esserci un'altra riga - diversa - corrispondente a quel ID)
02/10/2013 14:26:52
Ragazzi, scusate, apprezzo le risposte a beneficio dei posteri, ma per quanto non sia un programmatore, qualcosa la mastico XD il mio dubbi era puramente generico e la storia dei log era solo per far capire da dove mi è venuto e dare una possibilità di riscontro ad altri. È ovvio che prima di fare qualsiasi modifica, mi assicuro di non fare nessuno danno e so bene come funziona la storia darkabe e dreamofyougdr, quindi grazie, ma la mia domanda rimane: "Se possono riordinare? Come?".
Il fatto che sia saggio o prudente lasciatelo decidere a me :-P
Grazie will del procedimento... non ci avevo minimamente pensato O___O proverò quando ne avrò necessita, per il resto vale lo stesso discorso, se fanno da referenti per JOIN o comunque incrocio di dati ovviamente non li tocco XD
Volevo solo sapere se era possibile e come u.ù Ed il tuo metodo dovrebbe fare al caso mio, grazie! :D
02/10/2013 17:50:07
Sai com'è, nell'incertezza meglio dire le cose come stanno xD. Comunque la soluzione di will è la migliore, ma non riuscirebbe a preservare in alcun modo eventuali chiavi (tranne tu non ti vada a lanciare N update su altre tabelle ad ogni inserimento nella nuova tabella).
Una soluzione alternativa, meno elegante, ma che se ben gestita riuscirebbe a risparmiarti la perdita di integrità referenziale la potresti applicare così:
1. Crei una copia della tabella e la salvi, sia mai esploda tutto.
2. Fai una SELECT ID FROM TABLE ORDER BY ID ASC. Otterrai la lista ordinata di tutti gli ID. Dovrebbe esser simile a questa:
lista[0]=1
lista[1]=2
lista[2]=4
lista[3]=8
lista[4]=15
lista[5]=19
3. A questo punto fai un ciclo per scorrere la lista, con dentro un'update simile:
UPDATE Tabella SET ID= INDICE_LISTA+1 WHERE ID= lista[INDICE_LISTA]
Se i vincoli sono ben settati (quindi con la clausola ON UPDATE CASCADE) dovresti trovarti la tabella compattata, e nessun vincolo perso. Dovresti.
02/10/2013 18:03:16
Avevo pensato che se non posso perdere i vincoli nella tabella che vado a creare mi salvo gli ID originali, poi li incrocio con le altre ed aggiorno gli ID delle altre con quelli nuovi corrispondenti, che secondo me è ancora più pulito xD
02/10/2013 19:04:46
Discussione seguita da
Pagine → 1 2
Rispondi alla Discussione Aggiungi ai Preferiti Inoltra Discussione Forum Programmazione, GDRCD, Open Source, Hosting Elenco Forum
Pirates of the Caribbean: Tides of War: Quarti di finale del torneo
DarkOrbit: Galactic Strife & Buono gratis 💥
Entropia Universe → Lascia che il tuo avatar esplori nuovi mondi e viaggi tra i pianeti in questo stupendo MmoRpg Sci-Fi Free to Play!
I dati del generatore di rank sono stati aggiornati!
Legacy of Magic: Il vecchio e la mappa
outrunstaff ha risposto alla discussione: Project OutRun PbC
meleys ha aperto un annuncio di ricerca: Westeros GDR ricerca Tester
Storie di Agarthi → Un Varco si apre davanti a te, un mondo tra i mondi è a portata di mano. Lasciati alle spalle le certezze, diventa quello che hai sempre cercato.
Lineage II: Black Friday di Lineage II
Il gestore di Ultima Espiazione Gdr ha risposto alla recensione di mancoicani
zannata ha recensito Sigil - La Città dei Portali
World of Tanks → Lanciati in epiche battaglie spalla a spalla con altri giocatori. Conquista la supremazia nel mondo dei Carri Armati!
Sea of Conquest: Tuffati nel mistero! 🌊
Pirates of the Caribbean: Tides of War: Evento di Ringraziamento!
Fervm: Aggiornamenti: Il Diario!
Hero Wars: Arrivano le Teenage Mutant Ninja Turtles! :-D
Lineage II → Entra in uno sconfinato mondo fantasy dominato da razze in contrasto tra loro. Scatena i tuoi poteri in uno dei Mmo più famosi al mondo!
Dall-E - Cos'è e cosa puoi fare con l'intelligenza artificiale DALL-E per generare immagini?
Cleveland City - Fantagiochi presenta il gioco di ruolo via chat Cleveland City!
Teen Wolf - Lista dei giochi di ruolo ad ambientazione Teen Wolf. Scatena il lupo mannaro che è in te!
Reame di Warrior Within - Recensione del GDR fantasy Reame di Warrior Within
Forum - Partecipa al nostro forum e discuti con gli altri utenti di GDR-online.com!
ClueTube - Intervista ai creatori di ClueTube il gioco online su YouTube che vi trasforma in veri detective!