Visualizzazione risultati 1 fino 18 di 18

Discussione: [MySQL] Auto-scalare una chiave primaria auto_increment

  1. #1
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito [MySQL] Auto-scalare una chiave primaria auto_increment

    Buongiorno a tutti,
    come da titolo si capisce che io vorrei far scalare una chiave primaria auto_increment presente nel mio database in modo automatico. Vi faccio un esempio:

    Chiave primaria auto_increment: id

    MySQL:

    ID | NOME | NUMERO
    1 | Paolo | 123
    2 | Anty | 456
    3 | Miki92 | 789

    Ora ammettiamo che elimino il record Anty ma aggiungo anche nuovi dati la tabella verrebbe così:

    ID | NOME | NUMERO
    1 | Paolo | 123
    3 | Miki92 | 789
    4 | Sebr | 568
    5 | BIggy | 312

    Ora ciò che chiedo è, si potrebbe con qualche script fare in modo che quando io elimino (sempre tramite php) un dato da MySQL tutti gli i campi ID scalassero fino a quando non si completa in questo modo:

    ID | NOME | NUMERO
    1 | Paolo | 123
    2 | Miki92 | 789
    3 | Sebr | 568
    4 | BIggy | 312

    Senza che però succeda questo quando aggiungo nuovi dati:

    ID | NOME | NUMERO
    1 | Paolo | 123
    2 | Miki92 | 789
    3 | Sebr | 568
    4 | BIggy | 312
    6 | Ned | 654

    Spero di essere stato chiaro.
    Apprezzi l'aiuto? Offrimi un caffè!

  2. #2
    Guest

    Predefinito

    A parte che non capisco il motivo di questa esigenza, puoi usare la sintassi:

    ALTER TABLE tabella AUTO_INCREMENT = XX;


    Ciao!

  3. #3
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Scusa ma con quella query dopo dovrei far manualmente ogni cambio?

    Ammettiamo che io abbia più di 100 record, ne aggiungo 10 ne elimino 30 quante query manuali dovrei fare?

    Ho chiesto questa cosa proprio perchè ho bisogno di fare tutto in modo automatico.
    Apprezzi l'aiuto? Offrimi un caffè!

  4. #4
    Guest

    Predefinito

    Quella query era la partenza su cui scrivere un tuo script adatto.
    Quel comando esegue un "ereset" del counter auto_increment, in modo tale da far scegliere a te da dove ripartire quando memorizzerai altri record.

    Nel tuo esempio, al momento dell'eliminazione, dovrai identificare l'ultimo id in ordine di grandezza e passarlo come argomento a quella query.


    Ciao!

  5. #5
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Un momento che non ho capito bene, allora vediamo:

    Quella query fa in modo che io possa scegliere da quale ID ripartire giusto?
    Ora tocca a me creare uno script che mi localizzi l'ID mancante e che...cosa devo fare poi?
    Apprezzi l'aiuto? Offrimi un caffè!

  6. #6
    Guest

    Predefinito

    Non ti deve "localizzare" l'ID mancante, ma l'ultimo memorizzato, così da usarlo nella query che ti ho postato sopra:

    ALTER TABLE tabella AUTO_INCREMENT = XX+1;

    dove XX è il risultato dello script che determina l'ultimo id memorizzato (puoi usare la funzione MAX(campo_id) per determinarlo)


    Ciao!

  7. #7
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da debug Visualizza messaggio
    Non ti deve "localizzare" l'ID mancante, ma l'ultimo memorizzato, così da usarlo nella query che ti ho postato sopra:

    ALTER TABLE tabella AUTO_INCREMENT = XX+1;

    dove XX è il risultato dello script che determina l'ultimo id memorizzato (puoi usare la funzione MAX(campo_id) per determinarlo)


    Ciao!
    Scusa debug,
    o non ho capito io o non sono daccordo.

    con
    Codice:
    ALTER TABLE tabella AUTO_INCREMENT = XX+1;

    ha lo stesso risultato di come se inserisse un record utilizzando l'autoincrement, lui invece vorrebbe che gli id scalassero e andassero a riempire il range id dei record che sono stati eliminati, quindi le chiavi senza record insomma.

    Per quanto ne so io, abbozzando un pò di pseudocodice potresti scandire la tabella con un comando iterativo e tramite due "puntatori" verifichi la condizione:

    IDprimopuntatore=1;
    IDsecondopuntatore = 2;
    while(...){



    se (IDprimopuntatore+1)!=IDsecondopuntatore



    modifichi l'id di IDsecondopuntatore con id+1 di IDprimopuntatore

    altrimenti

    se IDprimopuntatore=1 e IDsecondopuntatore=2
    IDprimopuntatore+1 == IDsecondopuntatore //allora è ordinata unitariamente e continui la scansione

    IDsecondopuntatore++;

    IDprimopuntatore++;
    }


    come pseudocodice, sempre se si può implementare,ha complessità lineare, quindi il tempo di calcolo aumenta linearmente in base all'aumentare degli n record della tabella, senza contare il tempo per le funzioni di mysql.

    spero proprio che esista un metodo migliore..
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  8. #8
    Guest

    Predefinito

    No, quell'alterazione setta il valore del prossimo auto_increment.
    E' lo stesso comando che si può trovare in phpmyadmin, nella sezione Operazioni.


    Ciao!

  9. #9
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da debug Visualizza messaggio
    No, quell'alterazione setta il valore del prossimo auto_increment.
    E' lo stesso comando che si può trovare in phpmyadmin, nella sezione Operazioni.


    Ciao!

    quindi se io diciamo da un tabella eliminassi un record:

    esempio ho:

    id | nome |
    1 pippo
    2 pluto
    3 titti
    4 beffa
    5 sissi

    ad un certo punto elimino pluto e mi rimane:

    id | nome|
    1 pippo
    3 titti
    4 beffa
    5 sissi

    come dovrei usare alter tab per alterare cosi:

    id | nome|
    1 pippo
    2 titti
    3 beffa
    4 sissi


    è questo che chiedeva myki no?
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  10. #10
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Si è proprio quello che chiedevo io Xsescott fino ad un certo punto ci so riuscire a creare il codice ma in altri punti non capisco come agire.
    Apprezzi l'aiuto? Offrimi un caffè!

  11. #11
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da miki92 Visualizza messaggio
    Si è proprio quello che chiedevo io Xsescott fino ad un certo punto ci so riuscire a creare il codice ma in altri punti non capisco come agire.

    toglimi una curiosità, elimini un record alla volta?
    se è cosi potresti fare:

    elimino id->4

    da :

    1
    2
    3
    4
    5
    6
    7

    rimane:

    1
    2
    3 fai un while partendo da ideliminato+1, scandisci tutti i record successivi e fai un alter table per orgni record settando l'id=id-1;
    5
    6
    7

    tu che dici?
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  12. #12
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    No sempre, cioè a volte elimino un solo record a volte elimino più record...capita in modo casuale i record che devo cancellare e non posso fare ogni volta manualmente a modificare tutti gli ID sopratutto ora che i record crescono sulla centinaia.
    Apprezzi l'aiuto? Offrimi un caffè!

  13. #13
    L'avatar di Xsescott
    Xsescott non è connesso AlterGuru
    Data registrazione
    08-02-2004
    Messaggi
    1,413

    Predefinito

    scusa, ma perchè hai l'esigenza di compattare il tutto?

    non mi dire che sei obbligato!!!O_o

    non ho mai visto script che richiedono l'esigenza di resettare gli indici per compattarli :)
    "Quando il potere dell'amore supererà l'amore per il potere il mondo conoscerà la pace" Jimmy Hendrix


    [ Richiesta: http://www.unibologna.eu/ ] --> [Risposta: http://www.magazine.unibo.it/Magazin...al_Portale.htm Morale] -->[ http://www.anti-phishing.it/news/art...s.13062007.php ]
    consoliwebsite.altervista.org

  14. #14
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Non è obbligatorio ma a me serve cosi
    Apprezzi l'aiuto? Offrimi un caffè!

  15. #15
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,283

    Predefinito

    spero però che tu abbia una tabella sola, e non altre che fanno riferimento a questa, altrimenti l'integrità referenziale se ne va a quel paese

  16. #16
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Aspetta cosa intendi con ciò che hai detto? Ho un altra tabella che trasferisce i dati in questa solo grazie ad un mio click però la tabella uno non ha un auto_increment mentre la tabella due si.
    Apprezzi l'aiuto? Offrimi un caffè!

  17. #17
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,283

    Predefinito

    intendo che se in altre tabelle fai riferimento usando il campo id alle righe di questa, cambiando la numerazione i riferimenti punteranno alle righe sbagliate. O forse ti sto sopravvalutando

  18. #18
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Mi sopravvaluti ho un sito internet solo per imparare qualche cosa in più la mia vera passione è l'informatica in generale precisamente il pc

    Comunque no, non ho ciò che chiedi.
    Apprezzi l'aiuto? Offrimi un caffè!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •