Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    30

    SQL: modifica di un campo primary key

    Espongo il mio problema:

    Ho una tabella tab1 in mysql:

    tab1(id ,info)

    supponendo che lo stato della tabella in un generico istante sia:

    id info

    1 xxx

    2 yyy

    3 zzz


    avrei bisogno di inserire "sotto" al campo xxx una informazione( ad esempio di valore kkk)
    il cui id sia quindi 2, incrementando gli id di yyy e zzz.

    quindi tab1 dovrebbe diventare:

    id info

    1 xxx

    2 kkk

    3 yyy

    4 zzz

    prima di inserire kkk, dovrei "fargli spazio" con una query
    ovvero mettere l'id di yyy a 3 e di zzz a 4

    il problema è che se uso una query del tipo
    codice:
    UPDATE tab1 SET id = id+1 WHERE id>=2
    non va, perchè id è primary key, la query incrementa prima yyy il cui id va 3 come quello di zzz (che non è ancora stato incrementato): quindi la query fallisce.

    qualcuno ha delle idee su come si potrebbe fare?

  2. #2
    non si deve fare. L'id ha il compito di identificare un specifico record e non di dare un ordinamento progressivo ai record.

    Se ti serve un ordinamento progressivo puoi usare una dataora di inserimento, oppure un campo apposito in cui movimenti l'ordine come ti pare. Sempre tenendo presente che l'inserimento fisico dei record nella tabella e' per definizione random e quindi non e' detto che fisicamente il record n. 3 sia posto dopo il record n. 2.

    Ovviamente poi potresti pure avere l'esigenza oltre che di "aprire" anche quella di "chiudere" un buco quando cancellerai un record.

    L'ordinamento dei record lo dovresti fare con order by.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Se tu hai realmente l' esigenza di fare una cosa del genere e sei in un caso in cui il db lo usi solo tu a bocce ferme, i casi sono due:
    1° trovi il modo di eseguire l' update al contrario partendo dall' ultimo (io pero' non ho mai provato)
    2° fai due query di update, la prima inserendo tutta una serie di valori non ancora utilizzati, la seconda per riprendere quei valori e riportarli a id+1

    per farti un esempio del secondo caso potresti fare la prima query cosi':
    UPDATE tab1 SET id = -id WHERE id>=2

    e la seconda cosi':
    UPDATE tab1 SET id = -id+1 WHERE id<0


    ho verificato che il campo generato da mysql come chiave primaria autoincrementata accetta anche valori negativi ( che sicuramente non vanno in conflitto con quelli autogenerati a salire partendo da 1 )

    Se invece le bocce non sono ferme devi per forza fare una query unica partendo dall' ultimo per evitare che qualcuno inserisca dei dati mentre fai i due update

    Ciauz

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    30
    grazie mille gianluca da ros, la seconda soluzione che hai proposto è proprio quello che fa al mio caso.

    @pietro.mac: grazie della risposta, so bene che i primary key non andrebbero toccati, il fatto è gli inserimenti di questo tipo saranno molto pochi, mentre la tabella sarà probabilmente molto grande, quindi sarebbe sprecato mettere un ulteriore campo per l'ordinamento.

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,925
    Ti basterebbe una semplice query

    update tabella set id = id + 1 where id > 1 order by id desc

    se poi segui il consiglio di Piero come sempre fai la cosa migliore.

  6. #6
    Ringrazio nicola per aver risposto in pratica a quello che dicevo nel punto 1; la sintassi order by.. desc fino ad ora l' avevo usata solo nelle select e non sapevo se poteva essere usata anche negli update.

    Anche secondo me e' giusto quello che dice Piero e spero che Obante utilizzi questo sistema una tantum

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    30
    Originariamente inviato da nicola75ss
    Ti basterebbe una semplice query

    update tabella set id = id + 1 where id > 1 order by id desc

    se poi segui il consiglio di Piero come sempre fai la cosa migliore.
    è vero, ancora meglio grazie
    non sapevo che la order by si potesse usare anche per le scritture
    grazie 1000

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.