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
Hogwarts Express - Harry Potter GDR Forum: 🦉 Gazzetta del Castello – Speciale nomine!
Nyx Insight - Project S.E.T.: Aggiornamenti Tryouts
New World Order → Diventa un agente del Nuovo Ordine Mondiale e affronta le forze occulte che minacciano il pianeta Terra in questo GDR Urban Fantasy per Mobile!
Sea of Conquest: Vi presento Fung! 🐼
Hero Wars: Guadagnare Catalysts nella Totem Fusion
Star Trek Horizon: Questlog: Il mondo fantasma
enigmatrix ha recensito Cleveland City
Seconda Era → Vaste terre coperte di ombre e misteri, dove ogni eroe scrive la storia del Mondo di Eidel. Seconda Era, Play By chat
I dati del generatore di rank sono stati aggiornati!
Il gestore di Exclusive Villa GdR ha risposto alla recensione di hhhh
enor_staff ha risposto alla discussione: Eroi di Enor
onestamente ha recensito Cleveland City
CRSED: F.O.A.D. → Brutale sparatutto MMO in cui vince l'ultimo giocatore che resta in vita nell'arena! Ogni giocatore sarà accompagnato da armi realistiche e magie!
Sea of Conquest: Nuovo Eroe: Alonso, la Lama d'Ombra!
Hero Wars: Lara Croft è ora disponibile per il preordine!
La Tana del Ladro: Ser Gnic e Lady Gnac
Le Cronache di Raja Dunia: Fiera Maggiore - Domogt Aral
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!
Statistiche Tecniche 2011 - Gdr-online.com pubblica i dati tecnici dei suoi visitatori del 2011. Spulcia i dati! ;-)
Tipi di Giochi - Gilraen e Mantis ci spiegano le differenze, i pro e i contro delle varie tipolgie di giochi di ruolo online testuali
Epic Quests - Epic quests: la popolarità dei temi fantasy nei giochi online
Power Player - Scopri chi sono i temuti Power Player e quali sono le loro caratteristiche! Articolo spassosissimo!
Eden's Grace - Intervista ai gestori del play by chat sperimentale ad ambientazione post apocalittica Eden's Grace
Stargate SG-1 - Stargate Command Online il gioco ambientato nella serie fantascientica che appassiona milioni di telespettatori
VilleNoire - Riapre VilleNoire: torna on-line il Play by Forum horror!
Seguici su X! - Segui GDR-online.com su X. Cinguettii continui con tutte le news dai GdR!