Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657

    inserire record tra due record

    Supponendo di avere una tabella del tipo

    [code]
    id | campo1
    ---|-------
    1 valore1
    2 valore2
    3 valore3
    [code]

    come faccio a inserire un record tra (per esempio) id 1 e id 2, medificando tutti i record che stanno sotto?

    una cosa del tipo

    [code]
    id | campo1
    ---|-------
    1 valore1
    2 nuova entry
    3 valore2
    4 valore3
    [code]

    che cosigli mi date x far ciò?

  2. #2
    Di non farlo e lasciare che l'id svolga la sua funzione di contatore univoco dei record.

    Se ti serve un riferimento numerico modificabile non usare un id autoincrement. Per farlo dovresti spostare su di uno tutti gli altri e poi assegnare l'inserimento. Ma se hai dei riferimenti ai record succede un papocchio.


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

  3. #3
    Premesso che il ragionamento di piero.mac e' fondamentalmente corretto, bisognerebbe vedere che tipo di vincoli Foreign Key hai sul db.

    Su Postgres puoi indicare esplicitamente il vincolo FK corredato della simpatica clausola ON UPDATE CASCADE.

    Su Mysql si debbono usare le tabelle InnoDb per farlo.

    Su Oracle e' possibile applicando un bel trigger on update....

    In ogni caso, su ogni db, se riesci a rendere attivo il vincolo on update cascade non dovresti fare papocchi con i dati referenziati....

    Se ho detto fagianate perdonatemi...

    Un saluto a tutti quelli che scrivono in OT... vi leggo sempre
    (slecchinata!)
    <<E' una decisione molto importante. Pensaci bene, Ataru!>>
    <<STOLTO! Non lo sai che io AGISCO SEMPRE PRIMA DI PENSARE???>>

  4. #4
    Appunto ... bisognerebbe vedere e valutare.

    Mi pare pero' di ricordare che FinalFantasy utilizzi il motore MyIsam di MySQL.

    In ogni caso, cambiare l'id dovrebbe essere solo un lavoro straordinario di manutenzione, non prassi abituale per ottenere un ordinamento. Per quello c'e' ORDER BY.


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

  5. #5
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    beh...io ho messo id così. Realmente ho un campo "ordine" che mi stabilisce l'ordine di questi record.

    Ho messo id qui x comodità, però lo scopo è lo stesso...

    Quindi con myisam, non posso fare tutto in cascata, ma modificare la cardinalità manualmente con ripetuti update, giusto?

  6. #6
    Si, in linea di massima si. Se non e' una chiave primaria non ci sono grossi problemi se non referenziali. L'id e' di solito anche chiave primaria (UNIQUE) e non permette l'inserimento di due valori uguali. Se il tuo campo e' numerico basta che fai una query unica di questo tipo:

    UPDATE tab
    SET campo_num = campo_num + 1
    WHERE campo_num > 1

    poi ti fai l'insert campo_num = 2

    Se per caso fosse univoco lo puoi fare lo stesso ma con ORDER BY DESC, in modo da non trovare mai valori duplicati...

    UPDATE tab
    SET campo_num = campo_num + 1
    WHERE campo_num > 1
    ORDER BY campo_num DESC


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

  7. #7
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    Originariamente inviato da piero.mac
    UPDATE tab
    SET campo_num = campo_num + 1
    WHERE campo_num > 1
    ORDER BY campo_num DESC

    UAZZZZZZZZ
    ecco la query dalle righe d'oro

    mi sarei rotto le palline a fare n query x ogni aggiornamento...

  8. #8
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    quel code funzionava bene...ma se io vorrei far salire un record?
    Una cosa così

    codice:
    num  | campo1
    -----|-------
     1   | bla1
     2   | bla2
     3   | bla3
     4   | bla4
    Voglio far salire 3, quindi la tabella divenda
    codice:
    num  | campo1
    -----|-------
     1   | bla1
     2   | bla3
     3   | bla2
     4   | bla4
    e possibile usando una query di quel tipo? Io avevo pensato di fare 2 query e di modifiacre quello ke avevo il numero ke precedeva ... ma stavo per combinare un spasticcio

  9. #9
    nel caso in cui inverti le posizioni devi fare tre queries....

    una rinomina il num 3 in un valore provvisorio
    la seconda aggiorna il num 2 in num 3
    la terza aggiorna il num provvisorio in num 2

    sempreche' questi campi siano UNIQUE altrimenti ne bastano due di passaggi

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

  10. #10
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    Originariamente inviato da piero.mac
    nel caso in cui inverti le posizioni devi fare tre queries....

    una rinomina il num 3 in un valore provvisorio
    la seconda aggiorna il num 2 in num 3
    la terza aggiorna il num provvisorio in num 2

    sempreche' questi campi siano UNIQUE altrimenti ne bastano due di passaggi
    nn sn unique, però uso sempre questa tattica

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 © 2025 vBulletin Solutions, Inc. All rights reserved.